【问题标题】:Entity Framework (relationship between the two objects cannot be defined)实体框架(无法定义两个对象之间的关系)
【发布时间】:2011-12-19 18:54:56
【问题描述】:

我正在尝试在 ASP .Net 网页中执行以下代码:

  using (var wpe = new CL40215_wpnEntities())
                {
                int cid = Convert.ToInt32(cmbCity.SelectedItem.Value);
                int catid = Convert.ToInt32(cmbCategory.SelectedValue);

             Post p = new Post
             {
                 title = txtTitle.Text,
                 description = txtDescription.Text,
                 User = u,
                 City = wpe.Cities.First(c => c.id == cid),
                 initialprice = 0,
                 finalprice = 10,
                 Category = wpe.Categories.First(c => c.id == catid),
                 postdate = DateTime.Now,
                 closedate = DateTime.Now.AddDays(Convert.ToInt32(cmbDays.SelectedValue)),
                currentprice = 1
             };
                wpe.AddToPosts(p);
                wpe.SaveChanges();
 }

但是,我收到以下错误:

无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。

有谁知道为什么会发生这种情况,以及如何解决这个问题?

【问题讨论】:

  • 你的 u 变量来自哪里?
  • u 是一个会话变量。
  • 好的,但它是实体对象吗?

标签: c# frameworks entity foreign-key-relationship


【解决方案1】:

尝试更改您的对象初始化以先附加帖子对象,然后创建关系。

    var category = wpe.Categories.First(c => c.id == catid);
    var city = wpe.Cities.First(c => c.id == cid);
    var user = wpe.Users.First(newU => newU.Id == u.Id);
    Post p = new Post
    {
        title = txtTitle.Text,
        description = txtDescription.Text,
        initialprice = 0,
        finalprice = 10,
        postdate = DateTime.Now,
        closedate = DateTime.Now.AddDays(Convert.ToInt32(cmbDays.SelectedValue)),
        currentprice = 1
    };
    wpe.AddToPosts(p);
    p.City = city;
    p.Category = category;
    p.User = user;

    wpe.SaveChanges();

如果您使用持久性感知类,则它们需要在创建关系之前相互了解。这意味着您需要在构建对象之前分离子对象,然后首先附加所有子对象,或者如上所述,首先附加新帖子。不确定您的 addtoposts repo 调用在做什么,但如果您在对象有效之前没有运行保存更改,这应该可以工作。

编辑:抱歉。我没有注意到正在添加用户对象。您将需要使用当前上下文重新加载用户,或者将用户从之前的上下文中分离出来并将其附加到当前上下文。

【讨论】:

  • 这个建议解决了这个问题。但是,添加用户时出现了一个新问题:一个实体对象不能被多个 IEntityChangeTracker 实例引用。如果我在 wpe.AddToPost() 之后移动要添加的用户,则会收到与以前相同的错误。
  • 这解决了问题。唯一的问题是从会话中检索到的用户,因此我无法检索其上下文。为了解决这个问题,登录页面已更改,因此它使用 MergeOption.NoTracking 检索用户。非常感谢您的建议,真的节省了我很多时间。
  • 没问题。对于您的下一个项目,可能值得关注 EF4.1,因为它支持 POCO 类而无需跟踪。这带来了一组不同的问题和更多的手动编码,但我们在大型项目中成功使用它,我发现它更容易用于 WEB 场景。特别是考虑到 WEB 是无状态的,并且无论如何您都无法跟踪回发的变化(不做一些令人讨厌的数据上下文共享,这是一个很大的问题)。关键是下一个项目:它有一个陡峭的学习曲线 :)
【解决方案2】:

其中一个可能的问题是u 引用User。我看不出它来自哪里,而且u 确实有可能来自不同的上下文。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多