我使用Entity framework 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,可以在我的数据库中找到,但是它的所有属性以及导航属性 - 目的地都可以更改(客户决定将信件发送到更多目的地或更少)目的地比以前 - 列表大小可以改变,但不是每个目的地的上下文)。 我根据客户提供的Ids填写目的地列表。意味着目的地由上下文跟踪。
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
}
我怎样才能实现这一目标? 感谢
答案 0 :(得分:-1)
代码看起来像下面的代码。在这种情况下,只是用数据库中的结果替换所有目的地。我假设对数据库的查询将填充数据表。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace ConsoleApplication93
{
class Program
{
static void Main(string[] args)
{
Letter newLetter = new Letter();
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(new object[] {1,"Destination1"});
dt.Rows.Add(new object[] {2,"Destination2"});
dt.Rows.Add(new object[] {3,"Destination3"});
dt.Rows.Add(new object[] {4,"Destination4"});
newLetter.Destinations = dt.AsEnumerable().Select(x => new Destination()
{
Id = x.Field<int>("Id"),
Name = x.Field<string>("Name")
}).ToList();
}
}
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; }
}
}