非索引、非唯一 属性 更改时出现重复值错误
Duplicate values Error on Non-Index, Non-Unique property change
我问了一个类似的问题,但这是导致相同错误消息的不同情况。
我正在更新一个非索引、非唯一 属性、PageNumber。
我收到以下错误
OleDbException: The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.
public void DoRenumberPages(object blah)
{
var hiddenPages = projectDB.Pages.AsEnumerable().Where(x => !IsVisibleDrawing(x.DrawingType) && x.DrawingType != 3001).ToList();
for (int i = 0; i < hiddenPages.Count(); i++)
{
hiddenPages[i].PageNumber = i + 1000;
}
var TOCPages = projectDB.Pages.AsEnumerable().Where(x => x.DrawingType == 3001).OrderBy(x => x.BookNumber).ToList();
for (int i = 0; i < TOCPages.Count(); i++)
{
TOCPages[i].PageNumber = i + 1;
}
var visiblePagesNotTOC = projectDB.Pages.AsEnumerable().Where(x => IsVisibleDrawing(x.DrawingType) && x.DrawingType != 3001).OrderBy(x => x.BookNumber).ToList();
for (int i = 0; i < visiblePagesNotTOC.Count(); i++)
{
visiblePagesNotTOC[i].PageNumber = i + TOCPages.Count() + 1;
}
projectDB.SaveChanges();
RenumberPages.EnableExecute();
}
页面模型Class
[Table("Content")]
public class Page
{
//** Primary Key
[Column("Counter")]
public int Id { get; set; }
public int ProjectCounter { get; set; }
public short Version { get; set; }
public short Revision { get; set; }
public bool Locked { get; set; }
public int DrawingType { get; set; }
//** Forign Key?
public int DeviceLocationCounter { get; set; }
//** Forign Key?
public int FolderID { get; set; }
[Column("Page")]
public int PageNumber { get; set; }
//** Indexed, Unique
public int BookNumber { get; set; }
public string PageIndex { get; set; }
//** Product
//** DrawingObject is not here
public bool Update { get; set; }
public short Flag { get; set; }
}
预计到达时间:
我已将 public int BookNumber { get; set; }
更改为 public int? BookNumber { get; set; }
这并不能解决问题。
好的,我可以开始这个项目了。
问题是我这里写的。如果你在某处启用查询打印设置 JetEntityFrameworkProvider.JetConnection.ShowSqlStatements = true;
(我在你的 Test.Program.Main
中做了)你可以看到 EF 运行s 的语句。第一个更新查询是
update [Content]
set [Page] = @p0
where ([Counter] = @p1)
@p0 = 3
@p1 = 2
如果您查看数据库,您 运行 查询时 Page = 3
已经包含在 Counter = 3
的记录中。您也无法在事务内部解决此问题,并且与其他(几乎所有)DBMS 也有同样的问题。
唯一的解决方案(如果您需要 Page
上的唯一索引)是在 2 个不同的 SaveChanges
中更新。例如:
1.设置Page = null
然后SaveChanges()
2.设置Page = number
然后SaveChanges()
Microsoft Access 允许唯一索引中出现重复的空值。如果您允许使用不同的数据库,您可能会遇到问题。
我问了一个类似的问题
我正在更新一个非索引、非唯一 属性、PageNumber。
我收到以下错误
OleDbException: The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.
public void DoRenumberPages(object blah)
{
var hiddenPages = projectDB.Pages.AsEnumerable().Where(x => !IsVisibleDrawing(x.DrawingType) && x.DrawingType != 3001).ToList();
for (int i = 0; i < hiddenPages.Count(); i++)
{
hiddenPages[i].PageNumber = i + 1000;
}
var TOCPages = projectDB.Pages.AsEnumerable().Where(x => x.DrawingType == 3001).OrderBy(x => x.BookNumber).ToList();
for (int i = 0; i < TOCPages.Count(); i++)
{
TOCPages[i].PageNumber = i + 1;
}
var visiblePagesNotTOC = projectDB.Pages.AsEnumerable().Where(x => IsVisibleDrawing(x.DrawingType) && x.DrawingType != 3001).OrderBy(x => x.BookNumber).ToList();
for (int i = 0; i < visiblePagesNotTOC.Count(); i++)
{
visiblePagesNotTOC[i].PageNumber = i + TOCPages.Count() + 1;
}
projectDB.SaveChanges();
RenumberPages.EnableExecute();
}
页面模型Class
[Table("Content")]
public class Page
{
//** Primary Key
[Column("Counter")]
public int Id { get; set; }
public int ProjectCounter { get; set; }
public short Version { get; set; }
public short Revision { get; set; }
public bool Locked { get; set; }
public int DrawingType { get; set; }
//** Forign Key?
public int DeviceLocationCounter { get; set; }
//** Forign Key?
public int FolderID { get; set; }
[Column("Page")]
public int PageNumber { get; set; }
//** Indexed, Unique
public int BookNumber { get; set; }
public string PageIndex { get; set; }
//** Product
//** DrawingObject is not here
public bool Update { get; set; }
public short Flag { get; set; }
}
预计到达时间:
我已将 public int BookNumber { get; set; }
更改为 public int? BookNumber { get; set; }
这并不能解决问题。
好的,我可以开始这个项目了。
问题是我这里写的JetEntityFrameworkProvider.JetConnection.ShowSqlStatements = true;
(我在你的 Test.Program.Main
中做了)你可以看到 EF 运行s 的语句。第一个更新查询是
update [Content]
set [Page] = @p0
where ([Counter] = @p1)
@p0 = 3
@p1 = 2
如果您查看数据库,您 运行 查询时 Page = 3
已经包含在 Counter = 3
的记录中。您也无法在事务内部解决此问题,并且与其他(几乎所有)DBMS 也有同样的问题。
唯一的解决方案(如果您需要 Page
上的唯一索引)是在 2 个不同的 SaveChanges
中更新。例如:
1.设置Page = null
然后SaveChanges()
2.设置Page = number
然后SaveChanges()
Microsoft Access 允许唯一索引中出现重复的空值。如果您允许使用不同的数据库,您可能会遇到问题。