实体框架模型和外键属性

时间:2010-05-02 07:48:00

标签: c# entity-framework

我有两个表格,我导入EF模型 第一个表有一个属性[section],它充当第二个表的外键。 当我将模型中的这个属性映射到表并尝试编译时,我收到此错误:

  

映射片段开始出现问题   在第158,174行:非主要密钥   列([])[部分]正在映射   在两个片段中都不同   概念方面属性 - 数据   不一致是可能的,因为   相应的概念方面   属性可以是独立的   修改。

如果我从它传递的模型中删除此属性,但是当我查询数据时,我没有section字段。

我知道我可以通过使用导航字段并从第二个表中读取此属性来获取它,但为了使其工作,我必须在查询中包含另一个表。

var res  = from name in Context.Table1.Include("Table2")...

为什么我只需要为一个字段包含关联?

更新
为了更清楚:

表1包含字段:
ItemId - 键
部分 - 外键
标题

表2包含字段:
SectionId - 键
名称

设置关联时,必须删除第一个表中的section属性。

2 个答案:

答案 0 :(得分:1)

您的主键是什么?是一个商店生成的?我怀疑你在某个地方错过了PK或身份。

提示:出现映射问题时,另一种方法是在EDMX设计器中创建所需的模型,然后让它为您创建数据库。将它创建的内容与您在SQL中创建的内容进行比较,通常很容易发现错误。

答案 1 :(得分:0)

在EF 4中,您可以使用FK associations

在EF 1中,从相关表中获取一个字段的最简单方法是项目:

var q = from t1 in Context.Table1
        where //...
        select new 
        {
            T1 = t1,
            Section = t1.Section.SectionId
        };
var section = q.First().Section;

如果它是关键属性,您可以通过EntityKey

获取值
var t1 = GetT1();
var section = (int)t1.SectionReference.EntityKey.Values[0].Value;

一般来说,我不喜欢这最后一种方法。它太特定于EF,如果您的查询MergeOption设置为NoTracking,则会失败。