我使用EF与MySQL的外部数据库(数据库从其他项目,刚刚连接到我的)。所以我不能改变数据库结构。
数据库有一些没有主键的表,但是如果我是对的,EF实体应该有主键。
我认为只读表不会有任何问题,我只需要为任何填充的实体添加键属性。但是,如果我需要向该表添加行,并且在OK上具有相同的值,该怎么办?我会得到相同值的主键已经存在的错误...
我需要任何帮助或建议,如何使用该表格。提前感谢
发布于 2016-10-11 19:21:08
您可以将所有列标记为PK的一部分,并在无跟踪模式下读取实体:
var data = db.TheTable.Where(...).AsNoTracking().ToList();如果您需要添加具有相同值的新行-这是可以的,除非您的数据库上下文中已经有相同的行。在No Tracking模式下,只有当您添加两个具有相同值的行时,才会发生这种情况。
解决方法:在单独的操作中添加行,在SaveChanges之后分离实体:
var row = ...;
db.TheTable.Add(row);
db.SaveChanges();
db.Entry(row).State = EntityState.Detached;
// now you can add the row again如果您需要删除未跟踪的行,则必须先附加它:
var row = ...;
db.TheTable.Attach(row);
db.TheTable.Remove(row);
db.SaveChanges();
db.Entry(row).State = EntityState.Detached;或者,您可以手动更改行状态:
var row = ...;
db.Entry(row).State = EntityState.Deleted;
db.SaveChanges();
db.Entry(row).State = EntityState.Detached;但是我不知道有多少行会被删除,如果你尝试删除有重复的行。
发布于 2016-10-11 17:21:48
每个表都必须有一个主键。我不知道您是否可以更改模式,但是,一个解决方案是在这些表上添加一个自动增量主键,并将该新列用作实体框架键。
这样,您可以插入具有相同值的行,同时拥有唯一的行标识符。将每一列都添加到主键约束是一种丑陋的解决方法。
https://stackoverflow.com/questions/39973873
复制相似问题