Entity Framework 5 - 无效列名 - 反向工程 Code First

3
使用Entity Framework 5、Visual Studio 2010以及Entity Framework Power Tools(Beta 2)扩展。以下是我的数据库表结构: Database Table Structure 我使用了上述扩展中的“Reverse Engineer Code First”功能,它生成了POCO类和一些“映射”文件(不确定是否为正式用语)以及一个单一的DbContext派生类。除了下面描述的更改外,所有这些生成的类都是由Power Tool生成的。
在Category.cs文件中,我添加了以下代码,以帮助简化对象图:
```csharp public class Category { public int CategoryId { get; set; } public string Title { get; set; }
// Added this code to help flatten the object graph a bit: public virtual ICollection Products { get; set; }
public override string ToString() { return string.Format("{0} ({1} products)", Title, Products.Count); } } ```
private ICollection<Product> m_Products = null;
public ICollection<Product> Products
{
    get
    {
        if (m_Products == null)
        {
            m_Products = new List<Product>();
            foreach (var categoryProduct in CategoryProducts)
            {
                m_Products.Add(categoryProduct.Product);
            }
        }
        return m_Products;
    }
    set { m_Products = value; }
}

我收到了以下异常,我知道这一定与映射有关,但我无法完全弄清楚。
Unhandled Exception: System.Data.EntityCommandExecutionException: An error occurred while 
executing the command definition. See the inner exception for details.
 ---> System.Data.SqlClient.SqlException: 
      Invalid column name 'Category_CategoryId'.

如果我需要发布更多信息,例如映射的具体细节,请告诉我,我会做到。我想尽可能保持简短,但我意识到我忽略了一些对于不熟悉工具生成的代码的人来说可能会让他们想要更多细节的东西。
3个回答

6

您已经在模型中添加了导航属性,因此EF正在尝试将其映射到数据库。 "Code First"意味着您的代码模型定义了数据库架构。

尝试向您的辅助属性添加[NotMapped]属性,以告诉EF忽略它们。


在这里,你去了。谢谢,我很感激。这为我提供了一个良好的起点,可以更深入地研究为什么这会给我带来问题。谢谢! - Jason Bunting

2

如果您自动创建了数据库方案,而且没有使用类似于(DropDatabaseAlways / DropDatabaseIfModelChanges)的策略 - 换句话说:您正在进行反向工程,那么似乎您需要手动在“Category”表上添加“CategoryId”列。

如果您不想使用该属性(我指的是在DB中),您可以使用数据注释[NotMapped]或Fluent APImodelBuilder.Entity<Category>().Ignore(x=> x.CategoryId)

最后,问题可能在映射中。我不知道您是否使用了数据注释或Fluent API,但是EF可能会自动查找一些DB列(从模型派生的逻辑行为),并且找不到它。在这种情况下,我建议您对映射进行修订。


谢谢您的回复,我很感激! - Jason Bunting

0

OP已经解决了他们的问题,但我遇到了一个类似的错误,不过有不同的解决方案。所以在这里提供给其他人:

我在实体之间的0..1关系中缺少了一个导航属性。一旦我在缺少它的实体上添加了适当的导航属性,问题就解决了。

更多细节:我有两个实体,它们之间使用FK具有0..1关系。实体A(父级)有一个FK指向实体B(子级)。子实体B有一个导航属性指向实体A,但A没有一个导航属性指向B。添加后,问题得到解决。


1
请纠正我,但在定义关系时,导航属性不需要在双方都存在...导航属性至少要存在于一个方向上。因此,我认为有必须的解决办法,即不需要在双方都添加导航属性(或使EF忽略/不映射此导航)。 - Prokurors

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接