2

我正在尝试学习如何创建一个使用 EF 和存储库模式的 Winform C# 应用程序。

据我了解,UI 层应该独立于实体框架(它通过存储库使用数据,它不应该关心是否有实体框架或任何其他数据提供者),但是如果 WinForms 项目没有参考,编译器会显示和错误到实体框架(当我添加对 EF 的引用时,一切正常)

错误信息

找不到具有不变名称“System.Data.SqlClient”的 ADO.NET 提供程序的实体框架提供程序。确保提供程序已在应用程序配置文件的“entityFramework”部分中注册

为什么编译器需要我的 Winform 项目来引用实体框架?

来自 Winforms 项目的代码

    private void MainForm_Load(object sender, EventArgs e)
    {
        //Customer is a POCO class
        using (var customers = new EfRepository<Customer>())
        {
            foreach (var c in customers.All())
            {
                CList.Items.Add(c.CustomerName);
            }
        }
    }

    private void SaveCustomerButton_Click(object sender, EventArgs e)
    {
        var newCustomer=new Customer();
        newCustomer.CustomerName = CName.Text;
        newCustomer.CustomerDescription = CDescription.Text;
        //newCustomer.
        using (var customers = new EfRepository<Customer>())
        {
            customers.Add(newCustomer);
            customers.Commit();
        }
    }

来自存储库项目的代码

public class EfRepository<T> : IRepository<T>, IDisposable where T : class//, IEntity<int>
{
    private FirstContext _ctx = new FirstContext();
    private DbSet<T> _set;

    public EfRepository()
    {
        //_ctx = _context;
        _set = _ctx.Set<T>();
    }
    public void Add(T newEntity)
    {
        _set.Add(newEntity);
    }
    public IQueryable<T> All()
    {
        return _set;
    }

语境

public class FirstContext : BaseContext<FirstContext>
{
    public DbSet<Customer> Customers{ get; set; }
}

[编辑]

我添加了 app.config(到我的 UI 项目)以及有关我的数据库的信息,但它仅在我将实体框架添加到我的 UI 项目时才有效,如果我从连接到数据库的 UI 项目存储库中删除 EF 不返回任何数据(也没有错误...)

这是我的 app.config 的内容:

<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <add name="RepositoryDb" connectionString="Data Source=.;Initial Catalog=RepositoryDb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
4

2 回答 2

4

你是对的,你的 GUI 项目不应该直接需要 EF 程序集。当然,它仍然会通过您的存储库项目加载它们。

但默认情况下,应用程序仅使用 1 个配置文件。
所以你确实需要 app.config 中的数据库设置,就像错误告诉你的那样。

添加 EF 库时,配置文件中可能有一些更改。当您再次删除库时,它可能会继续工作。

于 2013-10-18T22:14:20.567 回答
2

将配置文件放入主应用程序后,这就是解决我的问题的方法

 public PSContext() : base() 
        {

            var type = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
        }

没有更多错误...

于 2014-03-20T19:33:48.930 回答