3

使用Entity Framework 5Visual Studio 2010Entity Framework Power Tools (Beta 2)扩展。

这是我的数据库表结构:

数据库表结构

我使用了上述扩展的逆向工程师代码优先功能,它生成了 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'.

如果我需要发布更多信息,例如映射的细节,请告诉我,我会做的。我想尽可能地简短,但我意识到我已经省略了一些东西,对于那些不熟悉该工具生成的代码的人来说,可能会让人们想要了解更多细节。

4

3 回答 3

6

您已向模型添加了导航属性,因此 EF 正在尝试将其映射到您的数据库。“代码优先”意味着您的代码模型定义了您的数据库模式。

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

于 2013-01-03T15:55:14.820 回答
2

如果您已经自动创建了数据库方案并且您没有使用 (DropDatabaseAlways/DropDatabaseIfModelChanges) 之类的策略 - 换句话说:您确实处于逆向工程中,您似乎必须在“类别”表上手动添加“类别 ID”列。

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

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

于 2013-01-03T16:09:42.187 回答
0

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

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

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

于 2013-04-05T01:14:24.483 回答