Entity Framework сопоставление отношений один к одному, сплющенное в коде - PullRequest
2 голосов
/ 24 июня 2011

У меня есть такая структура таблицы.

Address:
AddressId int not null primary key identity
...more columns

AddressContinental:
AddressId int not null primary key identity foreign key to pk of Address
County
State

AddressInternational:
AddressId int not null primary key identity foreign key to pk of Address
ProvinceRegion

У меня нет контроля над схемой, это просто так.

Теперь я хочу создать один объект Address.

public class Address
{
    public int AddressId { get; set; }
    public County County { get; set; }
    public State State { get; set }
    public ProvinceRegion { get; set; }
}

Я хочу, чтобы EF вытащил его из базы данных как единое целое. При сохранении я хочу сохранить отдельную сущность, и EF знает, как разбить ее на три таблицы.

Как бы я отобразил это в EF 4.1 Code First?

Я искал вокруг и пока не нашел ничего, что бы соответствовало моему делу.

UPDATE

Запись адреса будет иметь запись в Address и запись в AddressContinental или AddressInternational, но не в обеих.

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

Здесь я бы использовал Fluent API.

mb.Entity<Address>()
  .Map(m =>
  {
    m.Properties(p => new
    {
      p.AddressId
    });
    m.ToTable("Address");
  });

mb.Entity<Address>()
  .Map(m =>
  {
    m.Properties(p => new
    {
      p.AddressId,
      p.County,
      p.State
    });
    m.ToTable("AddressContinental");
  });

mb.Entity<Address>()
  .Map(m =>
  {
     m.Properties(p => new
     {
       p.AddressId,
       p.ProvinceRegion
     });
     m.ToTable("AddressInternational");
  });
1 голос
/ 25 июня 2011

запись адреса будет иметь запись по адресу и по одному в любом AddressContinental или Адрес международный, но не оба.

Это требование делает ваше первое требование невозможным для выполнения. @OpticalDelusion показал вам способ сопоставления разбиения объектов, но он работает, только если требуются все части. EF не может сделать это условно. Более того, если вы попытаетесь сохранить новую разделенную сущность, она всегда создаст новую запись во всех 3 таблицах.

Вам нужен не плоский объект, а наследование TPT (таблица на тип), где у вас будет:

public abstract class Address
{
    public int Id { get; set; }
    public string Name { get; set; }

}

public class AddressContinental : Address
{
    public string Country { get; set; }
    public string State { get; set; }
}

public class AddressInternational : Address
{
    public string ProvinceRegion { get; set; }
}

public class Context : DbContext
{
    public DbSet<Address> Addresses { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<AddressContinental>().ToTable("AddressContinental");
        modelBuilder.Entity<AddressInternational>().ToTable("AddressInternational");
    }
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...