如何在实体框架上下文类的模型制作dynamicaly变化科拉姆名
我有一个基类这样的:如何在实体框架上下文类的模型制作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");
假设我有上百个班,我会为每个实体逐个进行配置,这是对时间的巨大浪费。
我该如何动态使用迭代或其他我不知道的工作来完成这项工作?
您可以使用DbModelBuilder.Types<T>
方法适用于所有BaseClass
派生实体定制约定:
modelBuilder.Types<BaseClass>().Configure(c =>
c.Property(e => e.Id).HasColumnName(c.ClrType.Name + "Id")
);
您可以使用Custom Code First Conventions这个。你的情况:
modelBuilder.Properties().Where(p => p.Name == "Id")
.Configure(c => c.HasColumnName(c.ClrPropertyInfo.ReflectedType.Name + "Id"));
我想你的解决方案,但列名现在baseid之后。 –
啊,是的,请参阅修改。 –
你在准备我的时候发布了这个,所以我想知道我是否应该发布它,因为它基本上是你答案的另一个变种。最后决定张贴它的记录:) +1 –
非常感谢伊万。这是我的情况的答案。 –