我使用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>
答案 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 tier
与web service
互动,则您的方法不适用,例如使用EF延迟加载。您可以将平面模型传递给包含所有所需属性的客户端。如果您直接在表示层中引用中间层而没有Web服务,那么您的方法可以正常工作。
答案 2 :(得分:0)
您应该将数据库逻辑与前端内容分开。查看Generic Unit Of Work and Repositories,了解使用UnitOfWork
和Repository
模式的好例子。
在发送对象之前使用DTO,视图或其他展平对象,或者至少不要延迟加载它们。 AutoMapper对于帮助创建dtos / non-db对象非常有用。