• OSharp DbContent初始化分析


    DBContent初始化 —— 关联Entity查找

    一、      关联到具体的Entity

     

    二、      通过EntityTypeConfiguration 关联到DbContent

     

    三、      在初始化DbContent时,映射相应的Entity对象

     

    四、      通过缓存DbContentType集合字典,查找DbContextInitializerBase

     

    五、      查找当前DbContent的Entity 

    六、      具体DbContent创建(自定义DbContent的实现)

    需实现DbContextInitializerBase基类

     

    筛选出当前DbContent的Entity

     

    初始化配置

     

     

    DBContent初始化 —— DBContent生成

    一、      主要方法

     

    二、      框架初始化入口

     

    三、      DatabaseInitializer数据库初始化——配置信息

     

    四、      DatabaseInitializer数据库初始化——生成

     

    附一段单元测试代码

      1 public class DbContentInitializeTest
      2     {
      3         [Fact()]
      4         public void DbContentInitialize_Test()
      5         {
      6             using (var context = new MyDbContext())
      7             {
      8                 context.AddEntityRegHelper(new CustomerRegstHelper());
      9                 context.AddEntityRegHelper(new CusRegstHelper());
     10                 IDatabaseInitializer<MyDbContext> initializer;
     11                 if (!context.Database.Exists())
     12                 {
     13                     initializer = new CreateDatabaseIfNotExists<MyDbContext>(); ;
     14                 }
     15                 else
     16                 {
     17                     initializer = new MigrateDatabaseToLatestVersion<MyDbContext, AutoMigrationsConfiguration<MyDbContext>>(); ;
     18                 }
     19                 Database.SetInitializer(initializer);
     20 
     21                 ObjectContext objectContext = ((IObjectContextAdapter)context).ObjectContext;
     22                 StorageMappingItemCollection mappingItemCollection = (StorageMappingItemCollection)objectContext.ObjectStateManager
     23                     .MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
     24                 mappingItemCollection.GenerateViews(new List<EdmSchemaError>());
     25             } 
     26         }
     27     }
     28 
     29     /// <summary>
     30     /// 自动迁移配置
     31     /// </summary>
     32     /// <typeparam name="TContext"></typeparam>
     33     public class AutoMigrationsConfiguration<TContext> : DbMigrationsConfiguration<TContext>
     34         where TContext : DbContext
     35     {
     36         /// <summary>
     37         /// 初始化一个<see cref="AutoMigrationsConfiguration{TContext}"/>类型的新实例
     38         /// </summary>
     39         public AutoMigrationsConfiguration()
     40         {
     41             AutomaticMigrationsEnabled = true;
     42             AutomaticMigrationDataLossAllowed = true;
     43             ContextKey = typeof(TContext).FullName;
     44         }
     45     }
     46 
     47     /// <summary>
     48     /// 实体注册Helper接口
     49     /// </summary>
     50     public interface IEntityRegstHelper
     51     {
     52         void RegTo(ConfigurationRegistrar confRegistrar);
     53     }
     54 
     55     // 客户
     56     public class Customer
     57     {
     58         public int CustomerID { get; set; }
     59         public String CustomerName { get; set; }
     60         public string Address { get; set; }
     61     }
     62     // 客户实体的注册Helper
     63     public class CustomerRegstHelper : IEntityRegstHelper
     64     {
     65         public void RegTo(ConfigurationRegistrar confRegistrar)
     66         {
     67             confRegistrar.Add<Customer>(new EntityTypeConfiguration<Customer>());
     68         }
     69     }
     70 
     71     public class Cus
     72     {
     73         public int CusID { get; set; }
     74         public String CusName { get; set; }
     75         public string Add { get; set; }
     76     }
     77     // 客户实体的注册Helper
     78     public class CusRegstHelper : IEntityRegstHelper
     79     {
     80         public void RegTo(ConfigurationRegistrar confRegistrar)
     81         {
     82             confRegistrar.Add<Cus>(new EntityTypeConfiguration<Cus>());
     83         }
     84     }
     85 
     86 
     87     public class MyDbContext : DbContext
     88     {
     89         public MyDbContext()
     90             : this(false)
     91         { }
     92 
     93         public MyDbContext(bool proxyCreationEnabled)
     94             : base("name=RongziCmsDbContext")
     95         {
     96             //The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'
     97             //for the 'System.Data.SqlClient' ADO.NET provider could not be loaded. 
     98             //Make sure the provider assembly is available to the running application. 
     99             //See http://go.microsoft.com/fwlink/?LinkId=260882 for more information.
    100             var _ = System.Data.Entity.SqlServer.SqlProviderServices.Instance;
    101             this.Configuration.ProxyCreationEnabled = proxyCreationEnabled;
    102         }
    103 
    104         List<IEntityRegstHelper> entityRegstHelperlist;
    105         // 添加实体注册
    106         public void AddEntityRegHelper(IEntityRegstHelper r)
    107         {
    108             if (entityRegstHelperlist == null)
    109                 entityRegstHelperlist = new List<IEntityRegstHelper>();
    110             entityRegstHelperlist.Add(r);
    111         }
    112 
    113         //public DbSet<Customer> Customers { get; set; }
    114         protected override void OnModelCreating(DbModelBuilder modelBuilder)
    115         {
    116             // 动态地加入实体
    117             if (entityRegstHelperlist != null)
    118             {
    119                 foreach (IEntityRegstHelper r in entityRegstHelperlist)
    120                     r.RegTo(modelBuilder.Configurations);
    121             }
    122         }
    123     }
    View Code
  • 相关阅读:
    python的metaclass
    鱼和水的故事
    iOS的QuickTime Plugin
    二进制/十六进制转浮点数的编程(互转类似)
    Android开发常见错误及技巧
    Mac 热键大全
    Java动态程序设计:反射介绍
    注册asp.net 4.0 到iis
    javascript常用判断写法
    将存储过程执行的结果保存到临时表
  • 原文地址:https://www.cnblogs.com/Hai--D/p/5416634.html
Copyright © 2020-2023  润新知