我正在尝试学习如何创建一个使用 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>