【问题标题】:Entity Framework 5 library consumers need entity framework dlls?Entity Framework 5 库消费者需要实体框架 dll 吗?
【发布时间】:2014-08-08 16:42:31
【问题描述】:

我有一个项目“Project.EntityFramework”,其中包含我的数据库的上下文。当尝试在同一解决方案“Project.Business”中使用来自单独项目的上下文时,例如:

using (var db = new EntityFramework.Entities())
{
    // Code
}

“使用”时出现编译器错误:

Error   12  'EntityFramework.Entities': type used in a using statement must be implicitly convertible to 'System.IDisposable'   ....

现在我可以 F12 并向下钻取到实体,并看到它正在实现 IDisposable - 如果我将引用 dll 放入“Project.Business”中的实体框架,我可以消除此错误,但这违背了什么目的我想要完成 - 在我的业务层中不依赖任何 EF。

我做错了吗?或者这就是它必须的样子?

【问题讨论】:

  • 如果你的业务层不想对EF有任何依赖,那么你的EF项目应该返回不依赖EF的东西,返回Entities这意味着你将直接使用EF对象、DbSetDbContextDbConfigurationDatabase 等...您可能希望返回更原始的内容,例如 IEnumerable<T>

标签: c# .net entity-framework entity-framework-5


【解决方案1】:

你没有做错任何事。如果您希望业务层不依赖于 EF,则需要使用其他东西包装对 DbContext 类的访问。存储库模式是一种流行的模式。

【讨论】:

  • 您能否提供一个示例来说明如何做到这一点?当我尝试使用 IDispoable 存储库这样做时,我遇到了同样的问题
【解决方案2】:

为了扩展@Spivonious 的答案,这是我为在我的 DbContext 上完成存储库模式所做的 - 希望它大部分都能正确实现:/

public interface IFooEntity : IDisposable
{
    IEnumerable<Foo> Get();
}

public class FooRepository : IFooEntity
{
    private readonly Entities _context;

    public FooService()
    {
        this._context = new Entities();
    }

    public IEnumerable<Foo> Get()
    {
        return _context.Foo;
    }

    public void Dispose()
    {
        _context.Dispose();
    }
}

问题的原始代码:

using (var db = new EntityFramework.Entities())
{
    // Code
}

改为:

using (var db = new EntityFramework.Repository.FooRepository())
{
    // Code
}

这允许我在单独项目中的代码使用我的存储库而不是上下文本身,从而使业务项目不必依赖实体框架引用。

【讨论】:

  • 看起来不错,尽管我会在 Get 方法中的 return 语句上抛出一个 ToList() 以使数据库查询在此处运行,而不是在您第一次枚举时运行。如果您确实想要这种行为,通常会返回 IQueryable。
【解决方案3】:

在添加一些代码并引用其中包含模型的 DLL 后,我遇到了同样的问题。经过一番摸索后,我意识到我没有引用 EntityFramework。添加后问题就消失了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多