【发布时间】:2017-06-01 04:26:40
【问题描述】:
我正在尝试使用单个Address 表来存储系统中具有通用KeyId 字段的多个实体的地址。一个客户可以有多个地址,一个供应商可以有多个地址。
地址类:
public int Id { get; set; }
public string Name { get; set; }
public string Address1 { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
public string ZipCode { get; set; }
// These 2 fields make it so I can get all of the addresses for a single Customer or Vendor
public string EntityType { get; set; }
public int KeyId { get; set; }
// Navigation properties
public Customer Customer { get; set; }
public Vendor Vendor { get; set; }
public Location Location { get; set; }
客户类:
public int Id { get; set; }
public string Name { get; set; }
// Navigation properties
public IList<Address> Addresses { get; set; }
供应商类:
public int Id { get; set; }
public string Name { get; set; }
// Navigation properties
public IList<Address> Addresses { get; set; }
DbContext:
builder.Entity<Customer>()
.HasMany(c => c.Addresses)
.WithOne(a => a.Customer)
.HasForeignKey(a => a.KeyId);
builder.Entity<Vendor>()
.HasMany(v => v.Addresses)
.WithOne(a => a.Vendor)
.HasForeignKey(a => a.KeyId);
当尝试为数据库播种(添加供应商以及一些地址)时,我遇到了如下错误:
SqlException:MERGE 语句与 FOREIGN KEY 约束“FK_Address_Customer_KeyId”冲突。冲突发生在数据库“MyDatabase”、表“dbo.Customer”、列“Id”中。
我很确定这是因为参照完整性表明数据库中没有您尝试将 ID 存储在 KeyId 中的客户。
是否有任何可能的方法可以使用 EF 使用 FluentAPI 执行此类操作,还是我在玩火?如果所有属性都相同,那么必须创建一个名为 CustomerAddress 和 VendorAddress 的类似乎太疯狂了。就好像我需要指定一个 EF 不允许你做的双外键。
附加说明:我想我将尝试在 SQL 管理工作室中设置所有内容,然后在 Visual Studio 中添加一个数据库优先的 EF 项目。我很想知道它将如何创建模型和数据库上下文。
【问题讨论】:
-
我认为你所追求的在 EF 中被称为复杂类型
-
@Chef_Code 复杂类型不是我想要的。它不适用于客户可以有多个地址而供应商可以有多个地址的一对多关系。
标签: c# sql entity-framework entity-framework-6 entity-framework-core