我们必须将数据从一个数据库传输到另一个数据库。所以我尝试编写一个程序,它从旧数据库中读取表,创建实体并在之后将它们存储在新数据库中。一开始它非常好用。我试图只读一个表并将其转移到新表。现在我收到以下错误:
"该物业' Id'是对象关键信息的一部分,不能 被修改。
不,我没有摆脱那个错误。即使我试图回到第一个实现(它像魅力一样)。这里我有表的定义:
这里是代码:
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循环我插入一个国家,在第二次迭代我得到错误。
答案 0 :(得分:1)
我怀疑你在循环的每次迭代中都在Nation
的同一个实例上运行。您似乎只创建了一个实例,然后随着时间的推移进行修改。实体框架正在尝试跟踪该实例,因此修改密钥会让人感到困惑。
将实例化移动到循环中,以便您创建新实例:
IEnumerable<DataRow> rows = table.AsEnumerable();
foreach(var nation in rows)
{
Nation nat = service.Create<Nation>();
// ...
yield return nat;
}