该物业的ID"是INSERT上对象关键的一部分

时间:2017-09-14 13:10:23

标签: c# entity-framework

我们必须将数据从一个数据库传输到另一个数据库。所以我尝试编写一个程序,它从旧数据库中读取表,创建实体并在之后将它们存储在新数据库中。一开始它非常好用。我试图只读一个表并将其转移到新表。现在我收到以下错误:

  

"该物业' Id'是对象关键信息的一部分,不能   被修改。

不,我没有摆脱那个错误。即使我试图回到第一个实现(它像魅力一样)。这里我有表的定义:

Table definition

这里是代码:

    class MappingUtility
    {
        public static IEnumerable<Nation> MapNation(DataTable table, IModelFactoryService service)
        {
            IEnumerable<DataRow> rows = table.AsEnumerable();
            Nation nat = service.Create<Nation>();
            foreach(var nation in rows)
            {
                nat.Id = (System.Guid)nation.ItemArray[0];
                nat.HVCode = (string)nation.ItemArray[1];
                nat.Kurzbezeichung = (string)nation.ItemArray[2];
                nat.KFZ = (string)nation.ItemArray[3];
                nat.iso_a2 = (string)nation.ItemArray[4];
                nat.iso_a3 = (string)nation.ItemArray[5];
                nat.iso_n3 = (string)nation.ItemArray[6];
                nat.Vollbezeichung = (string)nation.ItemArray[7];
                nat.Updated = DateTime.Now;
                nat.Created = DateTime.Now;
                yield return nat;
            }
        }
    }

    using (var da = new SqlDataAdapter("SELECT * FROM NATION", "....."))
    {
        var table = new DataTable();
        da.Fill(table);
        using (var context = new DAtenbankContext())
        {
            int i = 0;
            foreach (var nation in MappingUtility.MapNation(table, ef6))
            {
                Debug.WriteLine(i++);
                if (context.Nation.Where(p => p.Id == nation.Id).FirstOrDefault() == null)
                {
                    try
                    {
                        context.Entry(nation).State = EntityState.Added;
                        context.SaveChanges();
                    }
                    catch(DbEntityValidationException ex)
                    {
                        Debug.WriteLine("");
                    }
                    catch (DbUpdateException ex)
                    {
                        Debug.WriteLine("There where some duplicate columns in the old table.");
                        Debug.WriteLine(ex.StackTrace);
                    }
                }
            }      
        }
    }

注意:id不会自动生成。如果我尝试一次只创建一个Nation,我可以插入它。即使有这个for循环我插入一个国家,在第二次迭代我得到错误。

1 个答案:

答案 0 :(得分:1)

我怀疑你在循环的每次迭代中都在Nation的同一个实例上运行。您似乎只创建了一个实例,然后随着时间的推移进行修改。实体框架正在尝试跟踪该实例,因此修改密钥会让人感到困惑。

将实例化移动到循环中,以便您创建新实例:

IEnumerable<DataRow> rows = table.AsEnumerable();
foreach(var nation in rows)
{
    Nation nat = service.Create<Nation>();
    // ...
    yield return nat;
}