2016-11-23 3 views
0

У меня есть иерархия таблицы с отображением таблицы на конкретный тип (TPC). (я не уверен, что [Key, Column] атрибут являются необходимыми, но по https://stackoverflow.com/a/19792915/959779 это должно работать)Отображение таблицы на конкретный тип (TPC) с составным ключом в EF6

структура Класс:

public abstract class BaseEntity 
{ 
    [Key, Column(Order = 0)] 
    public int Id { get; set; } 
} 
public class Page: BaseEntity { 
    string Data { get; set; } 
} 
public class PageBackup: Page { 
    [Key, Column(Order = 1)] 
    public int PageId { get; set; } 
    public virtual Page Page { get; set; } 
} 

Когда Id из Page и PageBackup образований являются пересекаются (после добавления к таблицам некоторые элементы) EF бросить на следующий excution

«Все объекты„EUICDataContext.Pages“в EntitySet должны иметь уникальные первичные ключи. Однако, экземпляр типа «Entities.PageBackup» и экземпляр типа «Entities.Page» оба имеют одно и то же значение первичного ключа, «EntitySet = Pages; Id = 6». "

Сущность отображение код ниже:

class PageMapping : EntityTypeConfiguration<Page> 
{ 
    public PageMapping() 
    { 
     Map(m =>{ m.ToTable("Page"); }); 
     HasKey(t => t.Id }); 
    } 
} 

class PageBackupMapping : EntityTypeConfiguration<PageBackup> 
{ 
    public PageBackupMapping() 
    { 
     Map(m =>{ 
      m.MapInheritedProperties(); 
      m.ToTable("PageBackup"); 
     }); 
     HasKey(t => new { t.Id, t.PageId }); 
    } 
} 

Проблема заключается в том, хотя в EF PageMapping имеет ключевое сценарий композитного Update-Database семян создает таблицу со следующей подписью:

CREATE TABLE [dbo].[PageBackup](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [PageId] [int] NOT NULL, 
    [Data] [nvarchar](max) NULL, 
    CONSTRAINT [PK_dbo.PageBackup] PRIMARY KEY CLUSTERED 
    (
      [Id] ASC 
    ) 

Is EF позволяет для создания таблиц с составными ключами (много примеров с отображением, но я не нашел никаких сообщений о миграции)

И как описать такую ​​конфигурацию от имени картографирования TPC?

Любое другое предложение по решению будет полезно.

ответ

1

Я играю с ним, похоже, что этот случай не поддерживается EF 6. Моя миграция автоматически генерируется с использованием первичного ключа Id.

CreateTable(
      "dbo.PageBackUp", 
      c => new 
       { 
        Id = c.Int(nullable: false), 
        PageId = c.Int(nullable: false), 
       }) 
      .PrimaryKey(t => t.Id); 

После этого я попытался управлять этим на EF Core 1.1.0. У меня была ошибка в этом случае

Ключ нельзя настроить на странице, потому что это производный тип. Ключ должен быть настроен на корневой тип «BaseEntity». Если вы не указали для «BaseEntity», которые должны быть включены в модель, убедитесь, что она равна , которая не включена в свойство DbSet в вашем контексте, ссылается на конфигурационный вызов на ModelBuilder или ссылается на навигацию тип, который включен в модель.

Я думаю, что это ограничение структуры Entity Framework. Вы можете поставить вопрос на EF repo с этим вопросом.

конфигурация

My EF Сердечника:

public class ProductContext : DbContext 
{ 
    public ProductContext() 
    { 

    } 
    public ProductContext(DbContextOptions<ProductContext> options) 
     : base(options) 
    { } 

    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder builder) 
    { 
     builder.UseSqlServer("Data Source=.\\sqlexpress;"); 
     base.OnConfiguring(builder); 
    } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .HasBaseType<BaseEntity>() 
      .ToTable("Page") 
      .HasKey(t => t.Id); 

     modelBuilder.Entity<PageBackup>() 
      .HasBaseType<Page>() 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

EF 6 версии:

public class ProductContext : DbContext 
{ 
    public DbSet<Page> Page { get; set; } 
    public DbSet<PageBackup> PageBackup { get; set; } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Page>() 
      .Map(m => m.MapInheritedProperties().ToTable("Page")) 
      .HasKey(t => t.Id); 


     modelBuilder.Entity<PageBackup>() 
      .Map(m => m.MapInheritedProperties().ToTable("PageBackUp")) 
      .HasKey(t => new { t.PageId, t.Id }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 
Смежные вопросы