1

给定以下两个模型:

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.MediaId”参数,其中包含现有媒体记录的 ID,并让 EF 进行关联。

但是,在调用 SaveChanges() 之后,在 Card 实例上更新的唯一属性是 CardId。我还需要检索 Media.FileName 并在 Card 实例上设置该属性。

有没有一种通用的方法告诉 EF 我要返回更新后的 Card 数据,并返回提交数据的关联媒体数据?

4

1 回答 1

1

可能引起一些混乱的是您使用实体模型作为ViewModel.

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

在这种情况下,您可能会拥有类似 aNewCardModel或只是简单的东西CardModel,它具有 UI 中显示的字段的属性,以及 Media 元素的 id。

然后您必须手动创建Card实例,填充信息(自动映射器会很有帮助),并且您需要Media通过 ID 查找实例并将该实例与新Card实例关联,然后再保存更改。

这个 SO 答案可能会更清楚地说明使用 ViewModels 的利弊: https ://stackoverflow.com/a/10928437/1373170

于 2012-10-18T00:24:41.600 回答