EF4一对多对一用Db外键

时间:2012-08-17 21:46:05

标签: entity-framework-4.1 ef-code-first fluent

我正在尝试首先使用现有数据库的代码。到目前为止它进展顺利,但现在我在一对多关系中失败了。

在db中有一个表客户和一个表地址,其中地址没有任何customerid,而是一个外部的一个到多个键FK_Address_Customer。

edmx中自动创建的类看起来像

客户:

public int CustomerID (PK)
public Address Address

地址:

public int AddressID (PK)
public HashSet<Customer> Customers

无论我在流畅的API中做什么,都会因无效列Address_AddressID失败或多重性与引用约束错误冲突。

我假设:

//Customer has one address, address can have multiple customers<br/>
pModelBuilder.Entity<Customer>().HasRequired(m => m.Address).WithMany(x => x.Customers);


//Address has multiple customers, customer has one address<br/>
pModelBuilder.Entity<Address>().HasMany(m => m.Customers).WithRequired();

我在其他表上使用HasForeignKey在数据库中没有外键,但是在上面的场景中它不起作用。我也试过通过MapKey传递外键名也没有运气。

我可以得到这种简单的关系吗?

由于

1 个答案:

答案 0 :(得分:2)

您必须在Customer表中告知EF FK的名称,否则它将使用默认Address_AddressIDHasForeignKey会发挥魔力。

pModelBuilder.Entity<Customer>()
             .HasRequired(c => c.Address)
             .WithMany(a => a.Customers)
             .HasForeignKey(c => c.AddressID);

AddressID实体中Customer是FK属性的位置。如果您在Customer实体中没有FK属性,则需要使用Map

pModelBuilder.Entity<Customer>()
             .HasRequired(c => c.Address)
             .WithMany(a => a.Customers)
             .Map(m => m.MapKey("AddressID"));

AddressIDCustomer表中FK列的名称。您始终需要该列具有一对多关系。

在您的实体中拥有和不拥有FK属性之间的区别在two types of associations supported by EF之间存在差异。