我必须管理这有点好笑,即使我想我理解为什么:)我创建了一个UnitTest来添加一个博客条目来尝试Alex关于我的继承问题的建议。现在我遇到了另一个。
[TestMethod]
public void UserCanAddBlogEntry()
{
var context = new EntityContext(Options.LazyLoading);
var user = (from u in context.Users
.Include("Blog.BlogEntries")
where u.Id == 1
select u).FirstOrDefault();
BlogEntry entry = new BlogEntry();
entry.Header = "Test Entry";
entry.Text = "Test Text blah blah blah";
entry.CreatedAt = DateTime.Now;
entry.Blog = user.Blog;
user.Blog.BlogEntries.Add(entry);
context.SaveChanges();
Assert.IsTrue(user.Blog.BlogEntries.Count > 0);
}
导致异常:
UserCanAddBlogEntry失败Zirzle.UnitTests
测试方法UserCanAddBlogEntry扔了 例外: System.InvalidOperationException: 检测到无效的关系修正 导航属性'用户'的 “个人资料”类型的实体。
不确定这张照片有什么问题。如果我在get查询中添加.Include(“Profile”),那么保存更改不会再抱怨了。我尝试为配置文件添加0.1关系结束,但这也没有用。有什么建议?我认为堆栈溢出个人EF专家可能有一个解释:)
答案 0 :(得分:1)
这个很有意思。
我假设Blog.BlogEntries
与BlogEntry.Blog
我还假设所有类的所有属性都是虚拟的,因此EF可以代理类。
鉴于这些假设,某些对象将被代理(user
和user.Blog
),因为ObjectContext
构造了它们而有些对象不会被代理(entry
)因为你创建了他们自己。
代理类会自动进行修复,即保持关系的两端同步
在代理用户身上这样做。博客:
user.Blog.BlogEntries.Add(entry)
会同时自动将entry.Blog
设置为user.Blog
,以保持两个关系同步。
另一方面,因为entry
没有代理:
entry.Blog = user.Blog
不会做修正。
所以在这段代码中你基本上做了两次修复的一半。我们应该优雅地处理这种情况,但显然我们不是,我将与团队讨论这个问题。
说完所有我建议你做一些简单的事情:
// notice there is no need to get the User just the users blog
var blog = (from u in context.Users
where u.Id == 1
select u.Blog).Single();
然后这样做:
BlogEntry entry = new BlogEntry();
entry.Header = "Test Entry";
entry.Text = "Test Text blah blah blah";
entry.CreatedAt = DateTime.Now;
entry.Blog = blog;
//because BlogEntry inherits from Post if I remember your model
context.Posts.Add(entry);
context.SaveChanges();
这应该有用。
亚历