2014-11-06 158 views
1

我试图掌握使用EF为即将到来的项目。EF6和业务逻辑层

目前我有这段代码第一码:

public class Blog 
{ 
    public int BlogId { get; set; } 
    public string Name { get; set; } 

    public virtual List<Post> Posts { get; set; } 
} 

public class Post 
{ 
    public int PostId { get; set; } 
    public string Title { get; set; } 
    public string Content { get; set; } 

    public int BlogId { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

public class BloggingContext : DbContext 
{ 
    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

这创建了数据库和表,我已经能够添加博客/后没有问题。但我对如何构建EF代码第一种方法感到困惑。

BlogPost是否应该引用BloggingContext然后有它们自己的get/add/update方法?

我是否应该创建单独的BlogManager/PostManager类,它们实际上会获取/添加/更新数据并仅返回实体对象?

我应该创建单独的类,它们继承自包含get/add/update方法的Blog/Post吗?

+0

我认为你应该不要做任何事情,因为你所需要的只是在你的代码示例中。 DbContext中的DbSet具有跟踪实体的机制。当你打电话给'dbContext.SaveChanges()'时,所有跟踪的更改都会转到Datebase – 2014-11-06 19:31:28

+0

你通常想要创建'IBlogRepository'和'IPostRepository'接口以及包装你的'BloggingContext'的相应实现。这样您就可以从业务逻辑类中抽象出ORM的实际实现和用法。 – 2014-11-06 19:33:31

回答

1

如果Blog和Post都有对的引用

否 - 类本身不应该绑定到特定的源。他们应该代表一个实体,并且独立于数据的来源。这样可以更轻松地进行单元测试,因为您可以创建完全独立于数据源的博客。

我应该创建单独的BlogManager/PostManager类,它们实际上是获取/添加/更新数据并简单地返回实体对象吗?

是 - 这通常称为,所以BlogRepositoryPostRepository可能会更好的名字。

由于这两者将相互依赖,因此创建存储库实现的IBLogRepositoryIPostRepository接口也很好,因此不会紧密地耦合存储库。然后,当您查询博客并希望发布博客时,BlogRepository可以将请求链接到IPostRepository

我应该创建从Blog/Post中继承的包含get/add/update方法的单独类吗?

没有 - 因为继承意味着一个“是”的关系 - 和一类节省一个博客它不一定是博客本身。

+0

感谢您的回复,您最后的观点确实让我思考如何构建我的应用程序。通常情况下,我可能会把所有与'Blog'有关的事情都放到一个'Blog'类中。例如如果我有一个UI功能(例如返回格式化为用户界面的数据),那么将会出现在'Blog'中,如果我有一个函数可以删除所有没有帖子的博客,那么这个博客也会出现在Blog中。如果像“删除所有没有帖子的博客”一样进入'BlogRepository',那么一个单独的用于UI功能的'BlogUI'类? – james 2014-11-07 10:16:54

+1

是的 - 理想的类应该有一个功能:携带数据,存储数据,计算,显示数据等都是不同的功能。否则,你最终会遇到难以改变,调试,测试,模拟等等的庞大课程。 – 2014-11-07 14:22:34

+0

发送给我很远的兔子洞,花了最多22小时阅读SOLID原则。起初,它似乎真的是反对我认为一个对象应该是。但我现在看到使用正确,并在需要的地方使事情变得更容易。 – james 2014-11-08 13:16:22

1

DbContext类可以自己处理与数据有关的所有事情。您不需要在实体类中包含对它们的引用(因为DbContext类打开了数据库连接,您也不应该引用它们)。 DbContext也将自己处理您的基本CRUD操作(通过使用其上的DbSets<T>,这是访问特定表格中的所有数据的简单方法)

如果你愿意,你也可以做什么@ Sergey在评论中提到了上述内容,并在其上实现了一个存储库接口,我写了一篇关于如何做到这一点的博客文章find here。基本上,您将其设置为一个通用存储库,其中包含DbContext类的背景参考,以及通过这种方式,你可以在你的应用程序代码和数据库逻辑之间搭起一个很好的层。

+0

该网址似乎是@ IronMan84。 – Tico 2014-11-06 19:47:07

+1

奇怪。 VPN上始终发生在我身上。请现在试试。 – IronMan84 2014-11-06 19:53:40

+0

谢谢,@ IronMan84,就像一个魅力。谢谢! – Tico 2014-11-06 21:33:55