是否有通用的方法让EF在提交更改后返回新的模型数据和相关的模型数据?

时间:2012-10-17 23:13:36

标签: c# asp.net-mvc entity-framework

鉴于以下两个模型:

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数据,还是返回提交数据的相关媒体数据?

1 个答案:

答案 0 :(得分:1)

可能导致一些混淆的事实是您使用实体模型作为ViewModel

我实际上建议创建真实 ViewModel类,这些类表示Controller接收的信息或用作视图的模型。不按原样使用实体模型。这似乎是额外的工作,但它确实让您可以更好地控制UI管理的内容以及实体的建模方式。

在这种情况下,您可能会有类似NewCardModel或仅仅CardModel的内容,它具有UI中显示的字段的属性,以及Media元素的ID。

然后您必须手动创建Card实例,填充信息(automapper可能会有很大帮助),您需要通过以下方式查找Media实例在保存更改之前,将该实例与新Card实例相关联。

这个SO答案可能会更多地阐明使用ViewModel的优缺点: https://stackoverflow.com/a/10928437/1373170