2014-06-16 2 views
1

내가 매우 간단하다 룩업 테이블이 제거됩니다접두사 테이블 이름을 판별 열

public class LookupType : Entity 
{ 
    public LookupType() 
    { 
    } 

    public LookupType(string value) 
    { 
     Value = value; 
    } 

    public string Value { get; set; } 

    // A few other properties 
} 

그리고 그것은

public class SomeType : LookupType 
{ 
    public SomeType() 
    { 
    } 

    public SomeType(string value) 
     : base(value) 
    { 
    } 
} 

이 나는 ​​또한에 대해 다음 매핑을 상속 몇 가지 클래스 OnModelCreating 메서드의 LookupTypes

// Lookup Types 
modelBuilder.Entity<LookupType>() 
      .Map<SomeType>(m => m.Requires("LookupType").HasValue("Some Type")); 

이제이 작업을 수행하면됩니다. 마이 그 레이션을 수행하면 식별자가 열 LookupType 인 테이블이 생성됩니다.

CreateTable(
      "dbo.LookupTypes", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        DisplayOrder = c.Int(nullable: false), 
        Value = c.String(), 
        TimeStamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"), 
        LookupType = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id); 

그러나 테이블 이름 앞에 접두어를 사용해야합니다. 내 컨텍스트의 OnModelCreating 방법에 내가 다음 줄을

modelBuilder.Types().Configure(entity => entity.ToTable("abc_" + entity.ClrType.Name)); 

를 추가 할 수 있도록 마이그레이션을 생성 할 때 LookupType 열은 이제 사라졌다.

CreateTable(
      "dbo.abc_LookupType", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        DisplayOrder = c.Int(nullable: false), 
        Value = c.String(), 
        TimeStamp = c.Binary(nullable: false, fixedLength: true, timestamp: true, storeType: "rowversion"), 
       }) 
      .PrimaryKey(t => t.Id); 

나는 접두사 구성을 주석 다시 LookupType 열을 가져다 줄 마이그레이션을 재생하기 때문에 문제를 일으키는 줄 알고있다.

열 정의가 변경되어서는 안되므로 discriminator 열이 제거되는 이유는 무엇입니까? 이 주위에 어떤 방법이 있어도 discriminator 열을 유지하고 테이블 접두사를 붙일 수 있습니까?

public class FooDb : DbContext 
    { 
     public FooDb() 
      : base("name=DefaultConnection") 
     { } 

     public DbSet<BarTypeA> BarTypesA { get; set; } 
     public DbSet<BarTypeB> BarTypesB { get; set; } 
     public DbSet<BarTypeC> BarTypesC { get; set; } 



     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 


      modelBuilder.Entity<Foo>() 
      .Map<LookupType>(m => m.Requires("xyx" + "FooType").HasValue("L")) 
      .Map<BarTypeA>(m => m.Requires("xyx" + "LookupType").HasValue("A")) 
      .Map<BarTypeB>(m => m.Requires("xyx" + "LookupType").HasValue("B")) 
      .Map<BarTypeC>(m => m.Requires("xyx" + "LookupType").HasValue("C")); 


     } 
    } 

개체 그래프는이 데이터와이를 채우는 것은 (사용하지 않은 종자 방법) 다음과 같습니다 :

답변

0

엔터티 프레임 워크가없는 계층 구조 상속 테이블에서 유형별 테이블로 전환하면 분명히 사용자 지정 매핑 정보를 지정할 수 없습니다.

가장 쉬운 수정은

// Lookup Types 
modelBuilder.Entity<LookupType>() 
     .Map<SomeType>(m => m.Requires("LookupType").HasValue("Some Type")) 
     .ToTable("abc_LookupTypes"); 

.ToTable("abc_LookupTypes") 그런 다음 엔티티 프레임 워크가 TPH에 다시 스위치를 추가했다. 위의 행과 중복되지만 Context 파일에 상속 된 유형을 추가 할 필요없이 작동합니다.

0

난 당신이 OnModelCreating에서 테이블 당 계층 (TPH) 상속을 지정할 필요가 있다고 생각

public class Foo 
    { 
     public int Id { get; set; } 
     public int DisplayOrder { get; set; } 
     public string Description { get; set; } 
     public string Package { get; set; } 
     public Byte[] TimeStamp { get; set; } 
    } 

    public class LookupType : Foo 
    { 
     public LookupType(){} 

     public LookupType(string value) 
     { 
      Description = value; 
     } 

     public string Description { get; set; } 
     // A few other properties 
    } 

    public class BarTypeA : LookupType 
    { 
     public BarTypeA() { } 
     public BarTypeA(string value) : base(value) { } 
    } 

    public class BarTypeB : LookupType 
    { 
     public BarTypeB() { } 
     public BarTypeB(string value) : base(value) { } 
    } 

    public class BarTypeC : LookupType 
    { 
     public BarTypeC() { } 
     public BarTypeC(string value) : base(value) { } 
    } 

콘솔 응용 프로그램

static void Main(string[] args) 
    { 

     using (var db = new FooDb()) 
     { 
      List<Foo> foos = new List<Foo>(){ 
       new BarTypeA ("peanutsA"){ DisplayOrder=100,Package="packA"}, 
       new BarTypeA ("olivesA"){ DisplayOrder = 101,Package="packB" }, 
       new BarTypeB ("peanutsB"){ DisplayOrder = 200,Package="packC" }, 
       new BarTypeB ("olivesB"){ DisplayOrder = 201,Package="packD" }, 
       new BarTypeC ("peanutsC"){ DisplayOrder = 300,Package="packE" }, 
       new BarTypeC ("olivesC"){ DisplayOrder = 301,Package="packF" } 
      }; 

      db.BarTypesA.Add((BarTypeA)foos[0]); 
      db.BarTypesA.Add((BarTypeA)foos[1]); 
      db.BarTypesB.Add((BarTypeB)foos[2]); 
      db.BarTypesB.Add((BarTypeB)foos[3]); 
      db.BarTypesC.Add((BarTypeC)foos[4]); 
      db.BarTypesC.Add((BarTypeC)foos[5]); 
      db.SaveChanges(); 
     } 
     Console.WriteLine("Press any key to end"); 
     Console.ReadLine(); 

    } 

데시벨에서 생성 된 테이블 :이드 DisplayOrder, 설명 패키지 소인 xyxFooType, xyxLookupType
1~100 NULL packA NULL NULL
2 101 NULL packB NULL NULL
3 200 NULL packC NULL NULL B
4 201 NULL packD NULL NULL B
5~300 packE NULL NULL NULL C
6 301 packF NULL NULL NULL C과 같다 initialSetup

최종적 부가 마이그레이션 :

CreateTable(
      "dbo.Foos", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        DisplayOrder = c.Int(nullable: false), 
        Description = c.String(), 
        Package = c.String(), 
        TimeStamp = c.Binary(), 
        xyxFooType = c.String(maxLength: 128), 
        xyxLookupType = c.String(maxLength: 128), 
       }) 
      .PrimaryKey(t => t.Id); 

소원 마이크로 소프트는 EF가 매우 강력 해 보이는 것처럼 샘플을 완벽하게 문서화하고 제공 할 수있는 리소스를 찾을 수있었습니다. 위의 시나리오가 시나리오에 맞는지 확실하지는 않지만 확실한 Discriminator 열 xyzLookupType을 생성합니다. db-migration 파일에 문제가 있었습니까? 디버그/obj 캐시가 동기화되지 않습니다. 좋은 문서/책을 찾고 있습니다. 설명이 테이블에 추가되지 않는 이유를 완전히 이해하지 못했습니다. 루트 유형이 아닌 BarTypes를 추가하고 있기 때문일 수 있습니다 (가상 속성이 필요할 수 있음). 또한 조상을위한 DbSets를 추가해야 할 수도 있습니다 ...

관련 문제