CSharp - 使用 Entity Framework 更新导航属性

  显示原文与译文双语对照的内容

我正在构建一个应用程序来帮助宿主一个 wine 夜间,它的中客人将尝试识别更贵的wine 瓶子。

为了简单起见,我只对两个entites进行阐述:


public class Choice
{
 public int Id { get; set; }
 public virtual Event Event { get; set; }
 public virtual Wine Wine { get; set; }
 public virtual ApplicationUser User { get; set; }
 public string Guess { get; set; }
 public string Comment { get; set; }
}

public class Event
{
 public int Id { get; set; }
 public string Name { get; set; }
 public DateTime Date { get; set; }
 public virtual ICollection<Wine> Wines { get; set; }
 public virtual ICollection<Choice> Choices { get; set; }
 public virtual ICollection<WineAnswer> Answers { get; set; }
}

现在,在视图中,客户猜测哪些 wine 是更贵的,我有隐藏的字段,它的中包含一些它的他实体:


 @Html.HiddenFor(event => event.Id)

现在,当访客通过 Web API 发布他们的选择时,模型是水合的,但是模型属性的导航是贫血的:


public async Task<IHttpActionResult> PostChoice(Choice choice)
{
/* At this point, the model looks like:
 Choice
. Id = 0
. Guess ="A",
. Comment ="My comment!",
. Event = { Event
. Id = 1,
. Name =""
. Date = 01/01/0001 00:00:00
 }
}

所以,如果我尝试在 Choice 上执行更新,Event 也将被更新,但是它的属性的默认值。 不好 !

在我保存之前,我可以做一些类似的事情:


 choice.Event = db.Events.Single(e => e.Id == choice.Event.Id)

但是有一个数据库命令可以获得 Event的所有必要属性,然后另一个用于不必要地更新它。 看起来像是一堆开销。

是否有更简单,更有效的方法?

时间: 作者:

EventID 属性添加到 Choice 实体中:


public class Choice
{
 public int Id { get; set; }

 [ForeignKey("Event")]
 public int EventID { get; set; }

 public virtual Event Event { get; set; }
 public virtual Wine Wine { get; set; }
 public virtual ApplicationUser User { get; set; }
 public string Guess { get; set; }
 public string Comment { get; set; }
}

这样可以在 EventChoice 之间创建one-to-many关系,当客人做出猜测时,你就不需要保存 Event 导航属性了。

我不确定你是什么样的模型或者视图,但是通过这种方法,你将简单地从 Event 实体分配事件 to 。 然后在表单中,你将具有该属性的隐藏输入:


@Html.HiddenFor(m => m.EventID)

然后简单地更新数据库中的Choice 实体,而不影响相应的Event

作者:

在数据库中更新模型时尝试这里操作。


context.Entry(Choice).State = EntityState.Modified;
context.Entry(Choice).Property(x => x.Event).IsModified = false;
context.SaveChanges();

作者:
...