【问题标题】:N-Tier Application With Entity Framework具有实体框架的 N 层应用程序
【发布时间】:2014-12-10 18:50:30
【问题描述】:

我使用 ASP.NET MVC 开发了一个 n 层应用程序。我可以切换我的 DAL 其他技术。 (ADO.NET、Oracle、MySQL 等。)但首先我使用 ADO 实体框架。但是我应该如何在我的实体中编码关系?例如,我有一个 Product 类,它是一个 Category 类。 (或者我只在我的产品实体中保存 CategoryId ??)如果我使用 EF,我在我的视图中使用 product.Category.CategoryName() 但我认为这是 n 层架构的错误方法。你对这个主题有什么建议。

//Entities
public class Product(){
    public int ProductId{get;set;}
    public string ProductName{get;set;}

    //id or class relation? which one???
    public int CategoryId{get;set;}
    public Category Category{get;set;} //This works just Entity Framework of course
}

public Category(){
    public int CategoryId{get;set;}
    public string CategoryName{get;set;}
}


//in my view 
<p>
@Product.Category.CategoryName //I think it's not right approach for n-tier application? Pls suggest.
</p>

【问题讨论】:

标签: c# asp.net asp.net-mvc entity-framework n-tier-architecture


【解决方案1】:

我通常在我的实体中包含外键。您还可以将相关的 Category 实体作为属性包含在您的 Product 类中,用于在您上面提到的视图中呈现等场景。

处理相关实体的一种常用方法是将virtual 关键字应用于它们,允许延迟或急切加载相关实体。这样,您可以对 Product 类执行 CRUD 操作,并且可以分配 Category(通过 CategoryId)而不需要 Category 属性的整个 Category 实体。然后,您可以选择在可能需要它们的查询中包含关系。

public class Product
{
    public int ProductId {get;set;}
    public string ProductName {get;set;}

    //id or class relation? both!
    public int CategoryId {get;set;}

    public virtual Category Category {get;set;}
}

预加载示例:

db.Products.Include(p => p.Category).ToArray();

<p>
@Product.Category.CategoryName 
</p>

【讨论】:

  • Virtual 也允许更改跟踪,对吧?它之所以有效,是因为 EF 在运行时会生成一个继承自您的新类定义并覆盖所有虚拟属性。
【解决方案2】:

您应该将数据库逻辑与前端内容分开。查看Generic Unit Of Work and Repositories,了解使用UnitOfWorkRepository 模式的好例子。

在发送对象之前使用 DTO、视图或以其他方式展平对象,或者至少不要延迟加载它们。 AutoMapper 对于帮助创建 dtos / non-db 对象非常有用。

【讨论】:

    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2023-03-27
    • 2012-03-28
    • 2012-12-17
    相关资源
    最近更新 更多