單個地址表用於存儲具有實體框架的許多實體(使用雙外鍵)的地址

c# entity-framework entity-framework-6 entity-framework-core sql

我試圖使用單個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”中。

我很確定這是因為引用完整性,說數據庫中沒有客戶,而您正在嘗試將其存儲在KeyId

有沒有辦法用F / FluentAPI做這樣的事情,或者我玩火?如果所有屬性都相同,那麼創建名為CustomerAddressVendorAddress的類似乎太瘋狂了。這幾乎就像我需要指定EF不允許你做的雙外鍵。

附加說明:我想我將嘗試在SQL管理工作室中設置所有內容,然後在Visual Studio中添加數據庫第一個EF項目。我很想知道它將如何創建模型和數據庫上下文。

熱門答案

看起來客戶/供應商與地址類之間的映射不正確。

您應該在Address表中有不同的ForeignKey列指向不同的父表[Customer / Vendor]。

因此,在更改之後,您的實體將如下所示:

地址:

 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; }
 public int CustomerId { get; set; }
 public int VendorId { get; set; }


 // Navigation properties
 public Customer Customer { get; set; }
 public Vendor Vendor { get; set; }

DBContext

builder.Entity<Customer>()
    .HasMany(c => c.Addresses)
    .WithOne(a => a.Customer)
    .HasForeignKey(a => a.CustomerId);

builder.Entity<Vendor>()
    .HasMany(v => v.Addresses)
    .WithOne(a => a.Vendor)
    .HasForeignKey(a => a.VendorId);

希望它會有所幫助。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow