【问题标题】:DataAccess layer, Model layer and POCO classes with Code First Entity Framework具有 Code First Entity Framework 的数据访问层、模型层和 POCO 类
【发布时间】:2012-11-12 07:16:01
【问题描述】:

我正在遵循“Programming Entity Framework Code First”中提出的建议架构路径。

在 VS 中有一个 DataAccess 层和一个 Model 层,它们都形成了单独的项目。

模型层包含我的业务对象类。 DataAccess 层具有对 Model 项目的引用,因此它可以为我的每个业务对象创建上下文和 DbSet。

问题是模型中的某些类需要访问数据层才能执行计算,但是我无法在模型项目中引用数据访问层,因为它会创建循环引用。 DataAccess 层必须引用 Model 层,以便它可以创建 DbSet。 另请注意,计算是只读的——只有 getter,不会持久化到数据库中。

我已经为此搜索了几个小时并找到了有用的信息,但我认为我错过了一些简单的东西? POCO 类本来就是简单的,但我的类代表了一些非常相关但计算更复杂的事物。

作为一个简单的具体示例,我有一个 Transaction 类和一个 AccountBalance 类。 Transaction 类需要知道特定日期的 AccountBalance 以用于显示目的——例如百分比变化(这只是一个简单的示例):

公共类交易

{
    public DateTime Date { get; set; }
    public string Description { get; set; }    
        ... etc    
    public double PercentageChange
    {
        get
        {
            // return TransactionAmount / AccountBalance on TransactionDate    
            //  however Transaction has no knowledge of AccountBalance... 
         }
    }
}

谢谢

【问题讨论】:

    标签: c# entity-framework code-first poco data-access-layer


    【解决方案1】:

    我个人将业务逻辑放在我的 POCO 中。恕我直言,您需要创建一个单独的服务层(或您所称的任何名称)并将业务逻辑放在那里。 POCO 应该是没有任何业务逻辑的简单对象。

    所以您的架构将如下所示:

    GUI -> 服务层 -> 数据访问层(存储库?) -> 数据库。

    现在您的所有项目都可以引用您的模型层。

    【讨论】:

    • 谢谢@Leon。听起来不错,但我仍然缺少一些东西。这缓解了访问问题,但我希望有一个包含所有必需属性的类(例如上面的 PercentageChange)。我可以通过创建公共类 TransactionService : Transaction 并将我的属性添加到...但是数据仍然与 Transaction 相关联,不是吗?如果我使用 _Context.Transactions.ToList() 我将无法访问我的新属性等。如果我在我的 TransactionsService 类中获取交易列表的额外逻辑,我将违背使用 EF 的目的......我困惑,谢谢帮助
    猜你喜欢
    • 2013-10-17
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多