2017-05-03 36 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 –