1

我在这里问了一个类似的问题,但这是导致相同错误消息的不同情况。

我正在更新一个非索引、非唯一属性 PageNumber。

我收到以下错误

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; }并不能解决问题。

4

1 回答 1

1

好的,我可以开始项目了。
问题是我在这里写的索引、主键或关系中的重复值。如果您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 允许在唯一索引中出现重复的空值。如果您允许使用不同的数据库,您可能会遇到问题。

于 2017-07-04T18:13:55.740 回答