【问题标题】:How to Embed Entity Framework in a Class Library如何在类库中嵌入实体框架
【发布时间】:2015-11-29 10:11:37
【问题描述】:

我想将我的实体数据模型嵌入到包含数据库操作方法的类库中。 (如 MyEntityDatamodel.dll)只需将我的实体框架嵌入式类库添加到我的 Windows 窗体应用程序中,我就可以使用它的方法(插入更新删除)。

目前我能够从 dll 运行方法,但问题是我必须将 EntityFramework.dll 和 EntityFramework.SqlServer.dll 添加到我的表单应用程序作为参考。否则它不起作用。我只想添加 MyEntityDatamodel.dll。

我的实体数据模型类的示例代码:

public class MyClass
{

   public string classParameter { get; set; }

   public void InsertMethod(MyClass parameter)
   {
       var dbContext = new MyEntities();
       InsertOperations...
   }

   public void UpdateMethod(MyClass parameter)
   {
       var dbContext = new MyEntities();
       UpdateOperations...
   }
}

我是如何使用的;

using MyClass;

MyClass myClass = new MyClass();
myClass.classParameter = "example";

myClass.InsertMethod(myClass);

提前致谢。

【问题讨论】:

  • 按照您的解释,您想解决什么问题?
  • 简单地说,我只想将一个包含实体数据模型的数据库操作的dll引用到我的winforms项目中。此 dll 必须包含实体数据模型及其自动生成的类、实体框架的库 dll。之后,我想通过这个 dll 从我的 winform 项目中使用 insert-update-delete 方法。我现在可以按照我描述的那样使用它。但问题是我必须添加实体框架的基本 dll 作为对我的 winform 项目的引用。我不想要这个。我想使用单个 dll。

标签: c# .net entity-framework dll class-library


【解决方案1】:

有两点需要注意...

首先,直接回答您的问题 - 您不能。您可以尝试一些复杂的技术,例如动态加载程序所需的程序集,但这几乎没有任何改变,只是您没有在项目引用中列出它们。它们仍然需要在装载机可以找到它们的地方。更重要的是它们必须始终与您的应用一起部署。否则将无法正常工作。

其次,DbContext 旨在用作 Unit-of-Work 设计模式,也就是说,它需要在单元完成它应该做的任何事情后被释放。通常,using 子句是一个很好的选择,因此请考虑以这种方式包装您的代码:

using (var dbContext = new MyEntities())
{
   InsertOperations.../UpdateOperations...
}

【讨论】:

  • 就我个人而言,我在库中定义了一个包含所有模型配置器的 DbContext 扩展。后来从我的主项目中,我创建了扩展 DbContext 的实例,并且我可以正确操作。我试图在图书馆里建一个工厂,但效果不好。
【解决方案2】:

在花了几个小时之后,我终于找到了解决方案。我可以在创建 dbcontext 对象之前将连接字符串注入到我的 dbcontext。

首先,我更改了 dbcontext 的构造方法。我为连接字符串添加了字符串参数,而不是从 web.config 中读取。

我改了这个;

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

到这个;

    public partial class ExampleEntities : DbContext
    {
        public ExampleEntities(string connStr) : base(connStr)
        {
        }
    }

然后我在我的代码中添加了一个生成连接字符串的方法;

        public static string CreateConnStr(string dataSource, string instanceName, string userName, string password)
        {
            string connectionString = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder
            {
                Metadata = "res://*/ExampleModel.csdl|res://*/ExampleModel.ssdl|res://*/ExampleModel.msl",
                Provider = "System.Data.SqlClient",
                ProviderConnectionString = new System.Data.SqlClient.SqlConnectionStringBuilder
                {
                    InitialCatalog = instanceName,
                    DataSource = dataSource,
                    IntegratedSecurity = false,
                    UserID = userName,
                    Password = password,              
                }.ConnectionString
            }.ConnectionString;

            return connectionString;
        }

现在我只是使用如下所示的 dbcontext;

var dbContext = new ExampleEntities(CreateConnStr("localhost\\SQLEXPRESS","ExampleDataBase","UserName", "Password"));

希望对你有帮助。

P.s.:抱歉语法不好。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 2014-10-13
    • 2011-07-17
    • 2016-06-25
    • 1970-01-01
    • 2013-06-29
    相关资源
    最近更新 更多