1. 程式人生 > >asp.net core高階EF Core2.0資料模型設計建立

asp.net core高階EF Core2.0資料模型設計建立

在我當前開源的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中的對映)新增到資料上下文中
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);
第4步在資料下文中建立對映,簡化的話,可以採用這個寫法
builder.ApplyConfiguration(new GroupMap);
            
base.OnModelCreating(builder);

但是這個簡化的寫法,以後只能繁瑣的把所有模型對映(比如GroupMap)通過AppConfiguration逐條新增到資料上下文中。所以建議還是採用反射遍歷所有的模型對映來建立資料模型。