0

我有一个如下表结构:

Companies           Addresses
*********           *********
ID                  ID
AddressID           ...
BillingAddressID    ...

AddressID 和 BillingAddressID 是地址表中的外键。当我基于这个表生成我的模型而不是在公司类中获得我期望得到的东西(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(不太清楚为什么会这样)。此外,这似乎很常见,只要我有外键,即我得到 Table 而不是 ID,然后是 TableReference。

我想我可以看到发生了什么,即,而不是单独给我 ID,它将进行查找并找到 ID 所指的实际记录。但是,我不太确定 TableReference 字段的用途......

可以为我更好地解释一下吗?

提前致谢。

4

3 回答 3

2

关系在实体框架中表示为对象,方式与实体相同。即使您不打算直接对它们进行大量工作,关系对象也是 EF 中的一等公民。EF 创建 ObjectStateEntry 对象来跟踪关系的变化,就像它为实体所做的那样。

这就是为什么有两个参考。第一个,AddressesReference 是对关系对象的引用,而不是确切的实体,第二个 Addresses 是实际实体。

Peter Chan (链接) 和 Julia Lerman 在她的《Programming Entity Framework, 1st Edition》一书中说,理解关系在 EF 中的工作方式非常重要。他们还提到,当他们开始使用 EF 时,这是让开发人员感到困惑的第一件事。

于 2009-08-30T10:18:27.280 回答
0

外键被外键指向的实体(集合)的引用替换。

因此,要将地址添加到公司,您可以执行以下操作:

Address a = new Address();
// ... set variables for address here

currentCompany.Addresses = a;
// or, the other way round (for collections)
a.Companies.Add(currentCompany);
于 2009-08-29T09:08:35.847 回答
0

EF 在构建模型时使用表名作为参考点,这就是为什么您会看到“地址”和“地址 1”。您可以以 GUI 格式打开实体模型并单击每个关联。这些可以重命名无论您喜欢什么,只需单击参考,查看映射,确保它是将“BillingAddressID”映射到“BillingAddressID”并将该参考重命名为“BillingAddress”的那个。

请注意,当前的“地址”参考可能是映射“BillingAddressID”的参考,因此您必须检查这两个参考。

如果它也是一对一映射,最好将“AddressID”的映射更改为“Address”而不是“Addresses”。

于 2009-08-30T00:52:49.083 回答