【问题标题】:EF4 One to many to one with Db foreign keyEF4 一对多对一与 Db 外键
【发布时间】:2012-08-17 21:46:05
【问题描述】:

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

在 db 中有一个表 customer 和一个表地址,其中 address 没有任何 customerid,而是一个外来的一对多键 FK_Address_Customer。

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

客户:

public int CustomerID (PK)
public Address Address

地址:

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

无论我在 fluent 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 传递外键名称,但也没有运气。

我怎样才能让这种简单的关系继续下去?

谢谢

【问题讨论】:

  • 你能发布你现有的数据库吗?您说 Address to Customer 上有一个外来的一对多键,但它不在上面的类中。您的客户对象是否有 AddressId,或者您使用的是链接表?

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


【解决方案1】:

您必须告诉 EF Customer 表中 FK 的名称,否则它将使用默认的 Address_AddressIDHasForeignKey 会变魔术。

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

AddressIDCustomer 实体中的 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

【讨论】:

  • 我已经尝试过你上面的两个建议,但都失败了。但是愚蠢的我,我没有研究外键的细节!尽管名称是 FK_Customer_Address,但基础列是 PhysicalAddressID 而不是 AddressID。所以我只是使用了错误的键,现在它使用外键是 PhysicalAddressID 。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多