我在这里问了一个类似的问题,但这是一种不同的情况,会导致相同的错误消息。
我正在更新一个非索引,非唯一属性,页码。
我收到以下错误
OleDbException:您请求的对表的更改未成功,因为它们会在索引、主键或关系中创建重复值。更改包含重复数据的一个或多个字段中的数据,删除索引或重新定义索引以允许重复条目,然后重试。
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();
}
页面模型类
[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 运行的语句。第一个更新查询是
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 允许在唯一索引中使用重复的 null 值。如果您允许使用不同的数据库,则可能会遇到问题。