提交更改后,是不是有通用方法让 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 返回新模型数据和关联的模型数据?的主要内容,如果未能解决你的问题,请参考以下文章

仅在 EF4 代码上创建数据库后更改模型

添加新迁移时,EF 数据迁移不会检测到更改

在EF中复制的SQL中添加十进制数的方法是什么?

save() 方法是不是异步提交更改?

Entity Framework 6 - . 创建新对象,保存更改,根据新 id 重新查询对象,返回 null

如何让所有实体访问:EDMX 中的内部而不是公共?