我正在做一个MVC4/EF5项目,我真的想在我的应用程序的设计上投入大量的时间。
我为自己制定了一个政策/原则。我的控制器需要是专用的,这意味着它们只能与一个特定的repo交互。
。(我只是在写一些伪代码)
对象:User, Blog, Post, Comment
UserController -> UserRepo ->处理User对象
BlogController -> BlogRepo ->处理Blog对象
等等……
现在我正在考虑下面的困境。用EF5创建/添加新对象到数据库的性能是什么?
方法1:向User添加一个功能,用于添加博客或帖子。
addBlog(Blog b){this.Blog.addBlog(b);}
addPost(int blogid, Post p){this.Blog(b).addPost(p);}
对我来说,这意味着每个post将初始化一个usercontroller,注入一个userrepo,并将在User表中有一个读取操作来获取对象。然后,它将执行addPost函数并保存更改。
方法2:给Blog和Post对象一些外键id
Blog property: UserId
Post property: UserId, BlogId
这意味着无论何时创建一个博客,一个blogcontroller将被启动,一个blogrepo将被注入,不需要'LOOKUP'。控制器只会将新的Blog对象添加到上下文中。(UserId属性是从websecurity上下文中设置的)
这也意味着无论何时创建一个post,都将启动一个postcontroller,注入一个postpo,并且不需要'LOOKUP'。控制器将只添加带有注入的UserId和BlogId的新Post对象。(是控制器动作的参数)
对我来说,第二种方法似乎是将负载分配到不同的表上,而不是一个表上。但是这种方法的缺点是您不能真正地进行模型测试。因为没有要测试的User对象的addBlog函数
我的问题有点清楚了吗?我真的很想为我的应用程序构建最高性能的框架。另外,User对象具有以下属性的影响是什么?
虚拟ICollection虚拟集合
它们都可以通过获取User对象来检索。(然后在虚拟对象上有延迟加载)
或者最好让专用的BlogController索引属于某个用户id的博客。
非常感谢所有的建议和评论!
Kr
在使用SQL Profiler调查创建的实体框架语句之后,我得出的结论是,如何创建新对象并不重要。
直接将一个新对象添加到repo中,创建的插入语句与通过另一个对象的集合添加对象时创建的插入语句相同。
公共类Blog
{
公共int Id{获取;设置;}
公共虚拟集合文章{获取;设置;}
}公共类Article
{
公共int Id{获取;设置;}
}