假设有以下两个模型:
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);
}我想创建一个新的Card,但将其与现有的Media对象相关联。我发布到“控制器/创建”,并包含一个"Media.MediaId“参数,该参数包含现有媒体记录的ID,并让EF进行关联。
但是,在调用SaveChanges()之后,在Card实例上更新的唯一属性是CardId。我还需要检索Media.FileName并在Card实例上设置该属性。
有没有一种通用的方法来告诉EF我想要返回更新的卡数据,并返回提交数据的相关媒体数据?
发布于 2012-10-18 08:24:42
可能会引起一些混淆的是您使用实体模型作为ViewModel的事实。
实际上,我建议创建真正的 ViewModel类,这些类表示控制器接收的信息或用作视图的模型。没有按原样使用实体模型。这看起来像是额外的工作,但它确实让你对UI管理的内容和实体的建模方式有了更多的控制。
在这种情况下,您可能会有类似于NewCardModel的东西,或者只是简单的CardModel,它具有UI中显示的字段的属性,以及媒体元素的id。
然后,您必须手动创建Card实例,填充信息(automapper可能非常有用),并且在保存更改之前,您需要通过ID查找Media实例,并将该实例与新的Card实例相关联。
这个答案可能会更多地揭示使用ViewModels的利弊:https://stackoverflow.com/a/10928437/1373170
https://stackoverflow.com/questions/12944820
复制相似问题