Я пытаюсь использовать одну 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
.
Есть ли какой-либо способ сделать что-то подобное w / FluentAPI с помощью EF или я играю с огнем? Кажется настолько сумасшедшим, чтобы создать класс CustomerAddress
и VendorAddress
если все свойства одинаковы. Это почти так, как будто мне нужно указать двойной внешний ключ, который EF не позволяет вам делать.
Дополнительное примечание. Я думаю, что я попытаюсь настроить все в студии управления SQL, а затем добавлю первый проект EF в Visual Studio. Мне любопытно посмотреть, как будет развиваться модель и контекст db.
Похоже, что сопоставление между классом Customer / Vendor vs 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);
Надеюсь, это поможет.