2

我喜欢使用EntityFramework在ASP.NET MVC上快速创建网站。我通常使用“数据库优先”原则和DbContext。你知道什么样的使用Entity Framework和DbContext的模式和实践?

我创建了一个与DbContext交互并返回,更改,删除和添加条目的全局层。像这样的:

GetLastPosts (int count) 
FindPostById (int id) 
RemovePost (int id) 
... 

所有在一个类。通常,它变得非常大,我不喜欢它。请告诉我您使用EntityFramework的经验。

+2

你为什么不尝试通过yuorself一些教程不是要求吗?你自己的经历是你在职业生涯中永远不会忘记的事情。 –

+0

什么教程? –

回答

1

我喜欢的一种模式(我不知道它是否是一个可识别的模式)是通过您在DBContext上创建扩展方法的,它允许您加载包含查询的类。这意味着你可以在一定程度上划分你的查询。

public static XTypeQueries XTypeQueries(this EntityModel db) 
{ 
    return new XTypeQueries(db); 
} 

,并在一个单独的文件

public class XTypeQueries : QueryLibrary 
{ 
    public XTypeQueries (EntityModel db) : base(db) { } 

    public IQueryable<Object> DoSomeQuery() 
    { 
     return from ... in this.db... 
       select ...; 
    } 
} 

你从伸出的查询库对象只是

public abstract class QueryLibrary 
{ 
    protected readonly EntityModel db; 

    protected QueryLibrary(EntityModel db) 
    { 
     this.db = db; 
    } 
} 

这样做的结果是,你可以做

var query = new EntityModel().XTypeQueries.DoSomeQuery(); 

我尽量保持t他的方法就像Queryable,这样当方法被调用时,你可以像你需要的那样具体,而不需要浪费大量的处理。您现在拥有组合在一起的查询库,但其行为与您在Linq上编写的行为一样。

+1

我不喜欢你在查询对象中公开IQueryable。做这样的对象的原因是为了在单元测试中轻易地模拟一个组件中的查询逻辑。暴露IQueryable时,你会使这些抽象漏掉。 – Pein

0

更新

我认为你需要创建一个单独的数据库层,你会需要很多的领域类而不是一个单独的类,它会做的操作,比如创建,更新和删除数据库实体就像Repository Pattern

例如要做与client有关的操作,您将需要ClientRepository类。

var clientRepo = new ClientRepository(); 
clientRepo.AddClient(Client clientEntity); 
List<Client> clientDM = clientRepo.GetClients(23); 
+0

你的代码示例是一团糟。我不确定它在任何行中的作用,这些方法返回的是什么,它们有什么副作用。 – Pein

+0

这里的想法很重要,而不是实际的实现。这里的代码是告诉你需要可以处理插入,删除和更新操作的域实体。 –

+0

然后这个想法也是错误的。实体不应承担坚持自己的责任。这是存储库的作用。 – Pein

相关问题