提交更改后,是不是有通用方法让 EF 返回新模型数据和关联的模型数据?
Posted
技术标签:
【中文标题】提交更改后,是不是有通用方法让 EF 返回新模型数据和关联的模型数据?【英文标题】:Is there a generic way to get EF to return new model data and associated model data after committing changes?提交更改后,是否有通用方法让 EF 返回新模型数据和关联的模型数据? 【发布时间】:2012-10-17 23:13:36 【问题描述】:给定以下两种模型:
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);
我想创建一个新卡,但将它与现有的媒体对象相关联。我发布到“Controller/Create”并包含一个“Media.MediaId”参数,其中包含现有媒体记录的 ID,并让 EF 进行关联。
但是,在调用 SaveChanges() 之后,在 Card 实例上更新的唯一属性是 CardId。我还需要检索 Media.FileName 并在 Card 实例上设置该属性。
是否有一种通用的方式告诉 EF 我要返回更新后的 Card 数据,并返回提交数据的关联媒体数据?
【问题讨论】:
“POST MediaId”是什么意思? 我使用 Media.MediaId 参数发布到“/Controller/Create”。 【参考方案1】:可能会引起一些混乱的是您使用实体模型作为ViewModel
。
我实际上建议创建 real ViewModel 类,这些类代表控制器接收到的信息或用作视图的模型。不按原样使用实体模型。这似乎是额外的工作,但它确实让您可以更好地控制 UI 管理的内容以及实体的建模方式。
在这种情况下,您可能会拥有类似 NewCardModel
或只是 CardModel
的东西,它具有 UI 中显示的字段的属性,以及 Media 元素的 id。
然后您必须手动创建 Card
实例,填充信息(automapper 可以提供很大帮助),您需要通过 ID 查找您的 Media
实例并将该实例关联到保存更改之前的新 Card
实例。
这个 SO 答案可能会更清楚地说明使用 ViewModel 的利弊: https://***.com/a/10928437/1373170
【讨论】:
感谢您的建议,但此示例中的代码更像是一个 API,与视图无关,并且非常小且非常专注,以至于视图模型会为该特定项目增加不必要的开销。我只是想知道是否有一种简单而通用的方法来告诉 EF 重新填充新模型并在它返回时包含子模型数据。 现在,即使我认为这不是正确的方法,您也可以通过 card.CardID 从上下文中再次获取它并返回它,而不是返回“card”。跨度>以上是关于提交更改后,是不是有通用方法让 EF 返回新模型数据和关联的模型数据?的主要内容,如果未能解决你的问题,请参考以下文章