EF4 - 添加博客条目抱怨个人资料?

时间:2009-05-29 02:02:24

标签: entity-framework

我必须管理这有点好笑,即使我想我理解为什么:)我创建了一个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专家可能有一个解释:)

1 个答案:

答案 0 :(得分:1)

这个很有意思。

我假设Blog.BlogEntriesBlogEntry.Blog

相反

我还假设所有类的所有属性都是虚拟的,因此EF可以代理类。

鉴于这些假设,某些对象将被代理(useruser.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();

这应该有用。

亚历