实体框架与mysql,实体没有PK

时间:2016-10-11 09:07:35

标签: c# mysql entity-framework

我使用EF和MySQL作为外部数据库(来自其他项目的数据库,只是连接到我的)。所以我无法改变数据库结构。

数据库有一些没有PK的表,但如果我是对的,EF实体应该有主键。

我认为只要阅读表格就不会有任何问题,我只需为任何填充的实体添加Key属性。但是,如果我需要在OK上向该表添加具有相同值的行呢?我会得到错误,PK已经存在相同的值......

我需要任何帮助或建议如何使用该标签。提前致谢

2 个答案:

答案 0 :(得分:1)

您可以将所有列标记为PK的一部分,并在无跟踪模式下读取实体:

var data = db.TheTable.Where(...).AsNoTracking().ToList();

如果需要添加具有相同值的新行 - 除非您在数据库上下文中已经有相同的行,否则这是正常的。使用无跟踪模式时,只有在添加具有相同值的两个行时才会发生这种情况。

解决方法:在单独的操作中添加行,在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;

但我不知道如果你试图删除带有重复项的行,会删除很多行。

答案 1 :(得分:0)

每个表必须拥有主键。我不知道您是否可以更改架构,但解决方案是在这些表上添加自动增量主键并将该新列用作实体框架密钥。

这样,您可以插入具有相同值的行,同时您将拥有唯一的行标识符。将每一列添加到主键约束是一个丑陋的解决方法。