ADO.NET实体数据模型:自动生成的类

时间:2009-08-29 08:55:16

标签: entity-framework entity-relationship ado.net-entity-data-model

我有一个如下表结构:

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字段是什么......

能为我解释一下吗?

提前致谢。

3 个答案:

答案 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”。