2017-05-03 40 views
4

我有一個基類這樣的:如何在實體框架上下文類的模型製作dynamicaly變化科拉姆名

public class BaseClass : IEditableObject { 

    public BaseClass() { 

    } 

    public Guid Id { get; set; } 

    public void BeginEdit() { 

    } 
    public void CancelEdit() { 

    } 
    public void EndEdit() { 

    } 
} 

而且我有2派生類這樣的:

public class User : BaseClass { 

    [Column("UserFirstName")] 
    public string FirstName { 
     get; 
     set; 
    } 

    [Column("UserLastName")] 
    public string LastName { 
     get; 
     set; 
    } 
} 

public class School : BaseClass { 
    [Column("SchoolName")] 
    public string Name { 
     get; 
     set; 
    } 
} 

我使用Entity Framework Code-First並在我的上下文類中配置這些類:

public class MyContext : DbContext { 

    public MyContext() : base() { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Configuration>()); 
    } 

    public DbSet<User> Users { get; set; } 

    public DbSet<School> Schools { get; set; } 

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

} 

當我運行程序數據庫和表被創建,但主鍵列名是Id爲每個表。我希望列名是用戶標識學校標識

所以我必須在模型中創建更改列名稱TableNameId配置實體

我能做到這一點的工作還有:

modelBuilder.Entity<User>().Property(i => i.Id).HasColumnName("UserId"); 
modelBuilder.Entity<School>().Property(i => i.Id).HasColumnName("SchoolId"); 

假設我有上百個班,我會爲每個實體逐個進行配置,這是對時間的巨大浪費。

我該如何動態使用迭代或其他我不知道的工作來完成這項工作?

回答

4

您可以使用DbModelBuilder.Types<T>方法適用於所有BaseClass派生實體定製約定:

modelBuilder.Types<BaseClass>().Configure(c => 
    c.Property(e => e.Id).HasColumnName(c.ClrType.Name + "Id") 
); 
+0

非常感謝伊萬。這是我的情況的答案。 –

3

您可以使用Custom Code First Conventions這個。你的情況:

modelBuilder.Properties().Where(p => p.Name == "Id") 
      .Configure(c => c.HasColumnName(c.ClrPropertyInfo.ReflectedType.Name + "Id")); 
+0

我想你的解決方案,但列名現在baseid之後。 –

+0

啊,是的,請參閱修改。 –

+0

你在準備我的時候發佈了這個,所以我想知道我是否應該發佈它,因爲它基本上是你答案的另一個變種。最後決定張貼它的記錄:) +1 –