2011-05-04 91 views
5

這是我的情況,非常簡化。將辨別器列更改爲實體框架中的int 4.1

我的課程;

public class ClassBase 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
} 

public class ClassMiddle1 : ClassBase 
{ 

} 

public class ClassMiddle2 : ClassBase 
{ 
    public Guid Token { get; set; } 
} 

public class ClassA : ClassMiddle1 
{ 
    public string UserId { get; set; } 
    public string Username { get; set; } 
} 

public class ClassB : ClassMiddle2 
{ 
    public string Username { get; set; } 
} 

And my OnModelCreating;

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      m.Properties(p => new { p.Id}); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle1>() 
     .Map<ClassMiddle1>(m => 
     { 
      m.Properties(p => new { }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassMiddle2>() 
     .Map<ClassMiddle2>(m => 
     { 
      m.Properties(p => new { p.Token }); 
      m.ToTable("TableBase"); 
     }); 

    modelBuilder.Entity<ClassA>() 
     .Map<ClassA>(m => 
     { 
      m.Properties(p => new 
      { 
       p.UserId, 
       p.Username 
      }); 
      m.ToTable("TableA"); 

     }); 

    modelBuilder.Entity<ClassB>() 
     .Map<ClassB>(m => 
     { 
      m.Properties(p => new 
      { 
       p.Username 
      }); 
      m.ToTable("TableB"); 

     }).Property(p => p.Username).HasColumnName("User"); 

} 

這工作正常,但Discriminator列默認爲Discriminator,NVARCHAR(128)。我讀到可以使用類似下面的內容來自定義此列。

m.Requires("ClassType").HasValue(1); 

我把我的可能性從內部轉移出去,但所有時間都陷入了死衚衕。 任何人有建議如何做到這一點?

我將以另一個問題結束。因爲我們的層次結構與上述類似,但是更多的派生類如C,D,E,F等等......我們發現EF正在製作這個令人難以置信的大數據庫查詢(〜150K)。其他人遇到這種情況?

我希望改變Discriminator,至少將其最小化。據我所說,我們有一個非常整齊的類層次結構,但一個醜陋的查詢集。

回答

5

遲到的回答實際的解決方案如何去。只是把它寫下來,因爲圍繞它的文檔不容易找到。

我的解決辦法弄成下面......

modelBuilder.Entity<ClassBase>() 
     .Map(m => { 
      ... 
      m.Requires("Discriminator").HasValue(1) 
     }); 
1

關於你的「令人難以置信的大數據庫查詢」:確實有performance and query generation issues with TPT inheritance mapping。目前似乎仍然沒有成爲這些問題,只有這個模糊的公告(2010年8月)修復:

的好消息是,我們正在 在這些問題上,使EF不再 產生不必要的SQL 。不好的 消息是,在修補程序在 未來版本中發佈之前,需要一些時間 。

(報價從上面的鏈接的文章)。