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

本文关键字:实体 PK mysql 框架 | 更新日期: 2023-09-27 18:12:43

我使用EF MySQL的外部数据库(数据库从其他项目刚刚连接到我的)。所以我不能改变数据库结构。

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

我认为我不会有任何问题,只是读取表,我只是添加键属性为任何填写的实体。但如果我需要在表中添加相同值的行呢?我会得到错误,相同值的PK已经存在…

我需要任何帮助或建议如何与那张表的工作。提前感谢

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

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

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

如果您需要添加具有相同值的新行-这是OK的,除非您在数据库上下文中已经有相同的行。在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;

但是我不知道如果你试图删除有重复的行,会删除多少行

每个表必须有一个主键。我不知道你是否可以改变模式,但是,一个解决方案是在这些表上添加一个自动增量主键,并使用新列作为实体框架键。

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