我想做的事情很简单。我有两个班:
public class TownRecord
{
public int Id { get; set; }
public string ShortName { get; set; }
public string FileName { get; set; }
public string tags { get; set; }
public virtual TownRecordType RecordType { get; set; }
public DateTime? DateScanned { get; set; }
public DateTime? RecordDate { get; set; }
[StringLength(4000)]
public string Comments { get; set; }
public string UploadedBy { get; set; }
}
public class TownRecordType
{
public int Id { get; set; }
public string RecordType { get; set; }
public virtual ICollection<TownRecord> TownRecords {get; set; }
}
当我想更新TownRecord类的RecordType属性时,我发现该关联无法更新。不会抛出异常但不执行更新:
[HttpPost]
public ActionResult Edit(int id, TownRecord tr, FormCollection collection)
{
TownRecordType newRecType = _ctx.TownRecordTypes.Find(Int32.Parse(collection["RecordType"]));
tr.RecordType = newRecType;
_ctx.Entry(tr).State = EntityState.Modified;
_ctx.SaveChanges();
return RedirectToAction("List");
}
注意:为清晰起见,我删除了错误处理...
我已经看到了类似于here的问题,但我没有得到它。这可能是一个非常愚蠢的菜鸟错误,但我已经StackOverflowing和谷歌搜索几个小时,无处可去。非常感谢任何帮助。
答案 0 :(得分:2)
这不起作用,因为您使用的是独立关联。 TownRecord
和TownRecordType
之间的关系不是城镇记录条目的一部分,因此将状态更改为已修改状态并未说明关系状态。这就是“独立”的真正含义 - 它有自己的条目,但由于未知原因,很难在DbContext API(EF 4.1)中获得它。建议的方法是使用外键关联而不是独立关联。要将关联更改为外键,您必须执行以下操作:
public class TownRecord
{
public int Id { get; set; }
...
[ForeignKey("RecordType")]
public int RecordTypeId { get; set; }
public virtual TownRecordType RecordType { get; set; }
...
}
您将代码更改为:
[HttpPost]
public ActionResult Edit(int id, TownRecord tr, FormCollection collection)
{
tr.RecordTypeId = Int32.Parse(collection["RecordType"]);
_ctx.TownRecords.Attach(tr);
_ctx.Entry(tr).State = EntityState.Modified;
_ctx.SaveChanges();
return RedirectToAction("List");
}
实际上,在您提出问题前2小时询问了question with the same problem。我也试图提供与独立协会合作的解决方案,但我不喜欢它。问题是,对于独立关联,您需要附加TownRecord
加载其实际TownRecordType
并将其替换为新TownRecordType
。