【问题标题】:The relationship between the two objects cannot be defined - why?无法定义两个对象之间的关系 - 为什么?
【发布时间】:2014-08-01 19:52:30
【问题描述】:

我正在提交一个表单,其中包含一个用户 ID 和一组以竖线分隔的数字。

模型如下所示:

public class SeasonPassData
{
    public int UserID { get; set; }
    public string SpaceNumbers { get; set; }
}

正在移交给这个控制器:

[HttpPost]
public ActionResult SignUp(SeasonPassData data)
{
    var user = db.Users.Find(data.UserID);
    List<SeasonPass> passes = new List<SeasonPass>();

    char[] delimiter = { '|' };
    var numbers = data.SpaceNumbers.Split(delimiter).Select(n => Convert.ToInt32(n)).ToArray();
    foreach(int number in numbers)
    {
        passes.Add(new SeasonPass { SpaceNumber=number, User = user });
    }
    passes.ForEach(p => db.SeasonPasses.Add(p));
    db.SaveChanges();

    return RedirectToAction("Confirmation", "Home");
}

并且应该创建和保存 SeasonPass:

public class SeasonPass
{
    public int ID { get; set; }
    public int SpaceNumber { get; set; }

    public virtual User User { get; set; }
}

但是,这个 - passes.ForEach(p =&gt; db.SeasonPasses.Add(p)); 一直在突袭这个异常:

“System.InvalidOperationException”类型的异常发生在 System.Data.Entity.dll 但未在用户代码中处理

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

我该如何解决?


我根据评论尝试了这些更改。好像还是不行……

[HttpPost]
public ActionResult SignUp(SeasonPassData data)
{
    using(var context = new TTUContext())
    {
        var user = context.Users.Find(data.UserID);
        List<SeasonPass> passes = new List<SeasonPass>();

        char[] delimiter = { '|' };
        var numbers = data.SpaceNumbers.Split(delimiter).Select(n => Convert.ToInt32(n)).ToArray();
        foreach (int number in numbers)
        {
            passes.Add(new SeasonPass { SpaceNumber = number, User = user });
        }
        foreach (var pass in passes)
        {
            context.SeasonPasses.Add(pass);
        }
        context.SaveChanges();
    }

    return RedirectToAction("Confirmation", "Home");
}

【问题讨论】:

  • 什么是db?那是ObjectContext吗?
  • @DaveZych 是的。很抱歉没有包括在内。
  • 有趣...我想知道 lambda 是在更新您的上下文还是什么?如果您只是执行“常规”foreach 循环和/或在上下文中放置 using{} 块,会发生什么?
  • @BobMac 刚刚发布了您的建议的更改 - 仍然没有运气。还有其他想法吗?
  • 让我的朋友大吃一惊。两个想法,将public int UserID { get; set; }添加到SeasonPass并使用它来设置用户关系。如果这不起作用,您是否尝试过重新启动 IIS?也许有什么东西卡在了 EF 的缓存中,导致了这种奇怪的行为。

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

我很惊讶你正在做的事情不起作用,但这是一种回避问题的方法。

public int UserID { get; set; } 添加到SeasonPass 并将其设置为分配关系而不是设置User

【讨论】:

  • 这就是我最终要做的。这很痛苦,但至少它有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多