Sea*_*ron 8 ef-code-first entity-framework-4.1
创建实例时,EF 4.1会同步反向关联.是否有针对此行为的任何文档或最佳实践指南?
同义反向关联的意思是:
public class Blog
{
public Blog() { Posts = new List<Blog>(); }
public int Id { get; set; }
public ICollection<Post> Posts { get; private set; }
}
public class Post
{
public Blog Blog { get; set; }
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后在以下行后,Post将拥有它的Blog属性集.
var blog = new Blog();
context.Blogs.Add(blog);
blog.Posts.Add(new Post());
Run Code Online (Sandbox Code Playgroud)
我相信 - 但我不确定 - "同步反向关联"是指实体框架中的一个功能,称为关系修复或关系范围,并负责在ObjectContext中的对象之间自动分配导航属性.这不是特定于EF 4.1,但也适用于旧版本.
我不知道这个功能的全面文档,但是这里有一些资源可以提供更多的洞察力 - 尤其是第二个:
简要定义:http://blogs.msdn.com/b/alexj/archive/2009/04/03/tip-10-understanding-entity-framework-jargon.aspx
更详细的解释(Zeeshan Hirani):http://www.daltinkurt.com/upload/dosyalar/file/Diger/entity_framework_learning_guide.pdf (第3.4章,第125-133 页)
关于想要避免关系跨度的情况:http://blogs.msdn.com/b/alexj/archive/2009/04/07/tip-11-avoiding-relationship-span.aspx
编辑
我无法全面解释关系跨度及其所有影响.但我可以尝试举几个例子,我感到安全,我所说的并不完全错误:
在您在评论中链接的答案中, Morteza在源自EntityObject(仅ObjectContext在EF 4.0中,DbContext在EF 4.1中不可能)和POCO(可能带有ObjectContext和DbContext)的实体之间产生差异.
如果您有POCO,那么将新对象添加到已加载到上下文中的另一个对象的导航集合中将不会将新对象附加到上下文.这并不奇怪,因为POCO很好......,POCO,这意味着他们对EF背景一无所知.将对象添加到导航集合实际上只不过是类似的东西List<T>.Add(...).此通用Add方法不对EF上下文执行任何操作.
这是另一种情况EntityObject,并EntityCollection二者均具有上下文引用内部,因此可以附加到上下文时,请立即添加到集合.
从这个考虑的一个结论是,您的问题中的最后一个代码示例实际上不会在您使用POCO时设置Blog属性Post.但是:它会在您调用DetectChanges或SaveChanges(DetectChanges内部调用)后设置.在这种情况下DetectChanges(这可能是一个非常复杂的方法)查看上下文中有哪些对象(它将找到Blog父对象),然后遍历整个对象图(Posts在我们的例子中是集合)并检查其他对象是否在图形(Post对象)也在上下文中.如果不是 - 在你的例子中就是这种情况 - 它会将它们附加到Added状态中的上下文中- 现在关系跨度发挥作用 - 同时修复对象图中的导航属性.
关系跨度也与POCO一起作用的另一种情况是将对象加载到上下文中.
例如:如果你在数据库中有一个Blogid = x和一个Postid = y的属于这个Blog,那么这个代码......
var blog = context.Blogs.Find(x); // no eager loading of the Posts collection!
var post = context.Posts.Find(y); // no eager loading of the Blog property!
Run Code Online (Sandbox Code Playgroud)
会自动在每个对象中建立导航属性,因此该Posts集合Blog将突然包含帖子,Blog属性Post将引用博客.这种关系修复取决于对象确实被加载到上下文中的事实.如果你通过使用AsNoTracking例如压制这个...
var blog = context.Blogs.AsNoTracking().Where(b => b.Id == x).Single();
var post = context.Posts.AsNoTracking().Where(p => p.Id == y).Single();
Run Code Online (Sandbox Code Playgroud)
...关系范围不起作用,导航属性将保留null.
最后一点:关系范围 - 如上例所示 - 仅在至少一端的0...1关联具有基数(一对一或一对多关联)时才有效.它永远不适用于多对多关联.这是最近在这里讨论的(使用EF 4.1):EF 4.1加载过滤的子集合不适用于多对多
| 归档时间: |
|
| 查看次数: |
2517 次 |
| 最近记录: |