【问题标题】:Override DbContext EF6覆盖 DbContext EF6
【发布时间】:2016-09-18 16:01:14
【问题描述】:

我试图了解如何为我的 DbContext 动态创建连接字符串,但我的应用程序说它在 app.config 中没有连接字符串(这是正确的,因为我不想在应用程序中使用它.config 或 web.config)。这就是我所拥有的:

在我的解决方案中,我有一个名为 InterfaceApp 的项目。它是一个 ASP.NET MVC 5 应用程序。当我将连接字符串放入 web.config 时,一切似乎都正常。

在我的解决方案中,我还有一个名为 InterfaceApp.Connector.Erp1 的项目。在这里,我想连接到一个 ERP 应用程序并获取一些项目。所以在我的存储库中,我有:

namespace InterfaceApp.Connector.Erp1.Repository
{
    internal class ItemRepository : IItemRepository
    {
        public IEnumerable<Item> Items
        {
            get
            {
                List<Item> items = new List<Item>();

                using (Models.Entities context = new Models.Entities())
                {
                     var itemList = context.Items.ToList();
                    foreach(var item in itemList)
                    {
                        items.Add(new Item() { Id = item.ID, Description = item.Description, ItemCode = item.ItemCode });
                    }
                }

                return items.ToList();
            }
        }
    }
}

我创建了一个部分类来连接数据库:

namespace InterfaceApp.Connector.Erp1.Models
{
    public partial class Entities
    {
        public Entities(string connectionString)
            : base(ConnectionString())
        {
        }


        private static string ConnectionString()
        {
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder
            {
                DataSource = "MyServer", //When this works it will be dynamic
                InitialCatalog = "XXX", //When this works it will be dynamic
                PersistSecurityInfo = true,
                IntegratedSecurity = true,
                MultipleActiveResultSets = true,

            };

            var entityConnectionStringBuilder = new EntityConnectionStringBuilder
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*/Models.Erp1Model.csdl|res://*/Models.Erp1Model.ssdl|res://*/Erp1Model.msl",
                ProviderConnectionString = sqlBuilder.ConnectionString

            };

            return entityConnectionStringBuilder.ConnectionString;

        }
    }
}

由 EF6(Db First)自动生成的 Context 类如下所示:

namespace InterfaceApp.Connector.Erp1.Models
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public virtual DbSet<Items> Items { get; set; }
    }
}

当我运行我的应用程序时,调试器会停在自动生成的类上,但不会停在我的部分类上。因为它在我的 app.config 和 web.config 中找不到连接字符串 Entities,所以它会生成一个错误,指出在应用程序配置文件中找不到连接字符串。我做错了什么?

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    当您调用 DbContext 时,您调用的是空构造函数 (new Models.Entities())。因此,它将调用自动生成的 DbContext。如果你想调用你的分部类,你需要用参数显式调用它。

    请记住,当您创建一个分部类时,编译器会将它们合并,因此您在编译时会得到这个:

    public partial class Entities : DbContext
    {
        public Entities()
            : base("name=Entities")
        {
        }
        public Entities(string connectionString)
            : base(ConnectionString())
        {
        }
    
    
        private static string ConnectionString()
        {
            SqlConnectionStringBuilder sqlBuilder = new SqlConnectionStringBuilder
            {
                DataSource = "MyServer", //When this works it will be dynamic
                InitialCatalog = "XXX", //When this works it will be dynamic
                PersistSecurityInfo = true,
                IntegratedSecurity = true,
                MultipleActiveResultSets = true,
    
            };
    
            var entityConnectionStringBuilder = new EntityConnectionStringBuilder
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*/Models.Erp1Model.csdl|res://*/Models.Erp1Model.ssdl|res://*/Erp1Model.msl",
                ProviderConnectionString = sqlBuilder.ConnectionString
    
            };
    
            return entityConnectionStringBuilder.ConnectionString;
    
        }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }
    
        public virtual DbSet<Items> Items { get; set; }
    }
    

    你可能需要一个方法来创建你的 DbContext 并调用它而不是调用一个新的 DbContext。

    public static Entities Create()
    {
        return new Entities(ConnectionString());
    }
    

    那么你可以这样使用它:

    using (var context = Entities.Create())
    {
         //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多