发现所有DbContext

本文关键字:DbContext 发现 | 更新日期: 2023-09-27 18:07:30

我的应用程序中有两个DbContext,它们用Fluent API配置一些模型。我的第一个DbContext的一个模型有一个指向第二个DbContext中配置的第二个模型的外键。

    public class UserData
    {
        public double Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public string FullName {
            get {
                return $"{this.FirstName} {this.LastName}";
            }
        }
        public string Adress1 { get; set; }
        public virtual BaseUserTreeData BaseUserTree { get; set; }
        public double? BaseUserTreeId { get; set; }
        public virtual List<DeviceData> Devices { get; set; }
    }

模型BaseUserTreeData是我在第二个DbContext中配置的外部属性。

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<BaseUserTreeData>().ToTable("sw_data_baseusertree");
            modelBuilder.Entity<BaseUserTreeData>().Property(baseusertree => baseusertree.Id).HasColumnName("baseusertree_ID");
            modelBuilder.Entity<BaseUserTreeData>().Property(baseusertree => baseusertree.Label).HasColumnName("label");
            modelBuilder.Entity<BaseUserTreeData>().Property(baseusertree => baseusertree.ParentTreeId).HasColumnName("baseUserTree_ID_parent");
            modelBuilder.Entity<BaseUserTreeData>().HasKey(baseusertree => baseusertree.Id);
            modelBuilder.Entity<BaseUserTreeData>()
                .HasOptional(tree => tree.ParentTree)
                .WithMany(tree => tree.ChildTrees)
                .HasForeignKey(tree => tree.ParentTreeId);
        }

当我第一次使用UserDataUserDbContext时,没有调用第二个DbContextOnModelCreating,因此没有执行BaseUserTreeData映射,实体框架6生成的查询是错误的。我看到我可以在单独的类中共享EntityConfiguration,但是是否有一种方法可以告诉EF6调用所有DbContext的每个OnModelCreating ?

发现所有DbContext

我想你走错路了。不推荐这样处理Context,如果模型之间有too strong relationship,就必须把模型集中在one unique context里面,否则以后会遇到很多问题。所以我的建议是使用EF team下面建议的模式。

这是Microsoft EF Team建议的方法:

当使用Web应用程序时,使用上下文实例请求。

你可以阅读更多关于context处理使用以下文章:

使用DbContext

使用实体框架正确地管理DbContext