鉴于以下两个模型:
public class Card
{
public int CardId { get; set; }
public Media Media { get; set; }
}
public class Media
{
public int MediaId { get; set; }
[Required]
public string FileName { get; set; }
}
以下控制器方法:
[HttpPost]
public ActionResult Create(Card card)
{
db.Media.Attach(card.Media);
ModelState.Remove("Media.FileName");
if (ModelState.IsValid)
{
db.Cards.Add(card);
db.SaveChanges();
}
return JsonNetSerializedResult(card);
}
我想创建一个新卡,但将其与现有的Media对象相关联。我发布到“控制器/创建”并包含一个“Media.MediaId”参数,该参数包含现有媒体记录的ID,并让EF进行关联。
但是,在调用SaveChanges()之后,Card实例上更新的唯一属性是CardId。我还需要检索Media.FileName并在Card实例上设置该属性。
是否有通用的方法告诉EF我想要返回更新的Card数据,还是返回提交数据的相关媒体数据?
答案 0 :(得分:1)
可能导致一些混淆的事实是您使用实体模型作为ViewModel
。
我实际上建议创建真实 ViewModel类,这些类表示Controller接收的信息或用作视图的模型。不按原样使用实体模型。这似乎是额外的工作,但它确实让您可以更好地控制UI管理的内容以及实体的建模方式。
在这种情况下,您可能会有类似NewCardModel
或仅仅CardModel
的内容,它具有UI中显示的字段的属性,以及Media元素的ID。
然后您必须手动创建Card
实例,填充信息(automapper可能会有很大帮助),您需要通过以下方式查找Media
实例在保存更改之前,将该实例与新Card
实例相关联。
这个SO答案可能会更多地阐明使用ViewModel的优缺点: https://stackoverflow.com/a/10928437/1373170