【发布时间】:2016-05-17 11:26:19
【问题描述】:
我使用实体框架 6 ORM 开发了一个 Web 应用程序。我遇到了一个问题,希望能得到帮助。
假设我的表格中有以下模型:
public class Letter
{
public int Id {get; set;}
public string Topic {get; set;}
public string content {get; set;}
public List<Destination> Destinations {get; set;}
}
public class Destination
{
public int Id {get; set;}
public string Name {get; set;}
}
在这种方法中,我收到了一封来自客户表格的信。这封信包含一个 Id 并在我的数据库中找到,但它的所有属性以及 导航属性 - 目的地可能已经改变(客户决定将这封信发送到比以前更多或更少的目的地 -列表大小可以更改,但不能更改每个目的地的上下文)。 我根据客户提供的 ID 填写目的地列表。这意味着目的地由上下文跟踪。
public void UpdateLetter(Letter updatedLetter, List<int> destinationsIds)
{
updatedLetter.Destinations = context.Set<Destination>().Where(x => destinationsIds.Contains(x => x.Id)).ToList();
context.Set<Letter>().Attach(updatedLetter);
context.Entry(updatedLetter).State = EntityState.Modified;
context.SaveChanges();
}
以上代码仅适用于标量属性。为了根据客户提供给我的 ID 更新目的地列表,我应该进行哪些更改?
如何告诉实体框架目的地列表已更改? (可以添加或删除项目)?
我的问题是保存更改时,只有简单的属性正确更新,但列表没有改变
我的意思是更新示例:
假设我的数据库中有这些目的地:
dest1 : Id = 1, Name = "Destination1"
dest2 : Id = 2, Name = "Destination2"
dest3 : Id = 3, Name = "Destination3"
dest4 : Id = 4, Name = "Destination4"
var listBeforeUpdate = new List<Destination>
{
dest1,
dest2,
dest3
}
现在,更新一封信后:
var listAfterUpdate = new List<Destination>
{
dest1,
dest3,
dest4
}
我怎样才能做到这一点? 谢谢
【问题讨论】:
-
为什么?是因为你自动想发出一封新信吗?变化是一个事件。所以你想创建一个新事件。然后,当发生更改时,List 类将触发事件。您还需要注册一个方法来调用像 UpdateLetter() 来处理事件。
-
我不关注。客户为自己保存了一封稍后发送的信。然后他决定更改目的地/标题/内容等。由于将状态更改为已修改,所有常规属性都会更新,但我不知道如何相应地设置新目的地
-
您应该能够更改目标的“名称”属性。目的地是一个 List 对象,因此您需要一个索引 Destinations[0].Name
-
我猜你还没有完全理解。我不是想改变目的地的内部属性。我想更改信件的目的地。意思是添加另一个目的地或删除目的地。
-
您要更改以下内容: public List
Destinations {get;放;}。该实例是 newLetter,因此您正在更改 newLetter.Destinations[0].Name。目的地是一个 List 对象,可以添加、删除或修改。
标签: c# entity-framework asp.net-web-api entity-framework-6