更新

时间:2016-05-17 11:26:20

标签: c# entity-framework asp.net-web-api entity-framework-6

我使用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
}

我怎样才能实现这一目标? 感谢

1 个答案:

答案 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; }
    }

}