具有实体框架的N层应用程序

时间:2014-10-15 15:54:06

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

我使用ASP.NET MVC开发了一个n层应用程序。我可以切换我的DAL另一种技术。 (ADO.NET,Oracle,MySQL等。)但首先我使用ADO Entity Framework。但是我应该如何在我的实体中编码关系呢?例如,我有一个Product类,它与Category类有关系。 (或者我只在我的产品实体中保存了CategoryId ??)我在我的视图中使用product.Category.CategoryName()如果我使用EF,但我认为这是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>

3 个答案:

答案 0 :(得分:0)

我通常在我的实体中包含外键。您还可以将相关的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>

答案 1 :(得分:0)

如果您的presentation tier通过middle tierweb service互动,则您的方法不适用,例如使用EF延迟加载。您可以将平面模型传递给包含所有所需属性的客户端。如果您直接在表示层中引用中间层而没有Web服务,那么您的方法可以正常工作。

答案 2 :(得分:0)

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

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

相关问题