我有一个如下表结构:
Companies Addresses
********* *********
ID ID
AddressID ...
BillingAddressID ...
AddressID和BillingAddressID是Addresses表中存在的外键。当我基于这个表生成我的模型而不是在公司类中得到我期望得到的(AddressID,BillingAddressID)。我得到以下内容:
public Addresses Addresses { .. }
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> AddressesReference { .. }
public Addresses Addresses1 { .. }
public global::System.Data.Objects.DataClasses.EntityReference<Addresses> Addresses1Reference { .. }
它似乎正在用Addresses1替换BillingAddress(不太确定为什么会发生这种情况)。此外,这似乎是常见的,无论我有一个外键,而不是ID我得到表然后TableReference。
我想我可以看到发生了什么,即不是单独给我ID,而是查找并查找ID所指的实际记录。但是,我不太确定TableReference字段是什么......
能为我解释一下吗?
提前致谢。
答案 0 :(得分:2)
关系在实体框架中表示为对象,与实体的方式相同。即使你不打算直接在他们身上工作,关系对象也是EF的头等公民。 EF创建ObjectStateEntry对象以跟踪关系的变化,就像对实体一样。
这就是为什么有两个参考。第一个,AddressesReference是对关系对象的引用,而不是确切的实体,第二个Addresses是实际实体。
彼得·陈(link)和朱莉娅·勒曼(Julia Lerman)在她的“编程实体框架”(Programming Entity Framework,1st Edition)一书中说,理解关系在EF中的作用非常重要。他们还提到,当开发人员开始使用EF时,这首先让开发人员感到困惑。答案 1 :(得分:0)
外键由对外键指向的实体(集合)的引用替换。
因此,要为公司添加地址,您可以执行以下操作:
Address a = new Address();
// ... set variables for address here
currentCompany.Addresses = a;
// or, the other way round (for collections)
a.Companies.Add(currentCompany);
答案 2 :(得分:0)
EF在构建模型时使用表名作为参考点,这就是你看到“Addresses”和Addresses1“的原因。你可以用GUI格式打开实体模型并点击每个关联。可以重命名为您喜欢的任何内容,只需单击引用,查看映射,确保它是将“BillingAddressID”映射到“BillingAddressID”并将该引用重命名为“BillingAddress”。
请注意,当前的“地址”引用可能是映射“BillingAddressID”的引用,因此您必须检查两个引用。
如果它也是一对一的映射,最好将“AddressID”的映射更改为“Address”而不是“Addresses”。