asp.net core高階EF Core2.0資料模型設計建立
阿新 • • 發佈:2019-02-18
在我當前開源的Zop框架中,網站的底層資料模型被設計為利用EF Core,並通過反射來進行批量建立模型資料上下文。
1、建立資料模型
/// <summary>
/// 群組
/// </summary>
public class Group : BaseEntity
{
public string Name { get; set; }
}
2、設定EF Core對映泛型類
public abstract class ZopEntityTypeConfiguration<T> : IEntityTypeConfiguration<T> where T : class { public ZopEntityTypeConfiguration() { PostInitialize(); } public abstract void Configure(EntityTypeBuilder<T> builder); /// <summary> /// Developers can override this method in custom partial classes /// in order to add some custom initialization code to constructors /// </summary> protected virtual void PostInitialize() { } }
3、建立模型在EF Core中的對映
public class GroupMap : ZopEntityTypeConfiguration<Group>
{
public override void Configure(EntityTypeBuilder<Group> builder)
{
builder.ToTable("Group");
builder.HasKey(g => g.Id);
}
}
4、將模型對映(EF Core中的對映)新增到資料上下文中
第4步在資料下文中建立對映,簡化的話,可以採用這個寫法var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() .Where(type => !string.IsNullOrEmpty(type.Namespace)) .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(ZopEntityTypeConfiguration<>)); foreach (var type in typesToRegister) { dynamic configurationInstance = Activator.CreateInstance(type); builder.ApplyConfiguration(configurationInstance); } base.OnModelCreating(builder);
builder.ApplyConfiguration(new GroupMap);
base.OnModelCreating(builder);
但是這個簡化的寫法,以後只能繁瑣的把所有模型對映(比如GroupMap)通過AppConfiguration逐條新增到資料上下文中。所以建議還是採用反射遍歷所有的模型對映來建立資料模型。