实体框架5 - 无效的列名称 - 反向工程师代码优先

时间:2013-01-03 15:43:50

标签: visual-studio-2010 entity-framework ef-code-first entity-framework-5

实体框架5 Visual Studio 2010 实体框架电源工具(Beta 2)扩展一起使用。

这是我的数据库表结构:

Database Table Structure

我使用了上述扩展的逆向工程师代码优先功能,它生成了POCO类和一些“映射”文件(不确定这是否是正式用法)和单个DbContext派生类。除了我接下来描述的更改之外,所有这些生成的类都是由电动工具生成的。

在Category.cs文件中,我添加了以下代码以帮助展平对象图:

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 个答案:

答案 0 :(得分:6)

您已为模型添加了导航属性,因此EF正在尝试将其映射到您的数据库。 “Code First”表示您的代码模型定义了您的数据库模式。

尝试将[NotMapped]属性添加到帮助程序属性,以告知EF忽略它们。

答案 1 :(得分:2)

如果你自动创建了DB方案并且你没有使用像(DropDatabaseAlways / DropDatabaseIfModelChanges)这样的策略 - 换句话说:你真的在逆向工程中,似乎你必须在“类别”上手动添加列“CategoryId” “表。

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

最后,问题可能出现在映射中。我不知道您是使用数据注释还是Fluent API,但EF可能会自动查找某些db列(从模型派生的逻辑行为)并且无法找到它。在这种情况下,我建议您修改映射。

答案 2 :(得分:0)

OP已经解决了他们的问题,但我遇到了与其他解决方案类似的错误。所以这是以防其他人需要它:

我在实体之间的0..1关系的一侧缺少导航属性。一旦我将相应的导航属性添加到缺少它的实体,问题就解决了。

更多细节:我有两个使用FK的0..1关系的实体。实体A(父)具有FK到实体B(子)。子实体B具有实体A的导航属性,但A 具有B的导航属性。添加后,问题解决了。