【问题标题】:Duplicate values Error on Non-Index, Non-Unique property change非索引、非唯一属性更改时出现重复值错误
【发布时间】:2017-06-30 01:52:28
【问题描述】:

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

我正在更新一个非索引、非唯一属性 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; } 这并不能解决问题。

【问题讨论】:

  • 如果主键是自动编号字段,则唯一的其他唯一索引位于 BookNumber 上,因此您正在创建重复的 BookNumber 值。在这段代码中不清楚它发生在哪里。可能存在与 BookNumber 在模型中不可为空且在 DB 中不可为空相关的问题。
  • 我已将 public int BookNumber { get; set; } 更改为 public int? BookNumber { get; set; } 这并不能解决问题。如果有帮助,我可以将源代码和访问数据库发送给您。
  • 如果你发给我一个可编译的例子(还有数据)我可以检查一下
  • @bubi:这是一个包含解决方案和数据库的 zip。只需运行测试项目。 1drv.ms/u/s!AsA1Mz52V5ZYg6RVOUldFiCekWrt_w
  • 我认为您使用 VS 2017 开发了该项目...无论如何,我已经很难安装它但我需要一些时间...

标签: jet-ef-provider


【解决方案1】:

好的,我可以开始这个项目了。
问题是我在这里写的duplicate values in the index, primary key, or relationship。如果您在某处启用查询打印设置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 允许在唯一索引中出现重复的空值。如果您允许使用不同的数据库,您可能会遇到问题。

【讨论】:

  • 页面列未列为唯一或数据库中的索引,但我仍然收到此错误。如果您在访问中打开数据库文件,您可以看到这一点。顺便说一下,数据库的密码是“SEEME”
  • 问题出在索引 Name 和 NameDesc 上。它们都是复合唯一索引。 编辑:你可以尝试在 Microsoft Access 中做同样的事情,你会收到同样的错误。
  • Name和NameDesc在哪个表?它不在内容表中。
  • 它们是 Content 表上的 2 个唯一索引。它们都包含 Page 列。
  • 哦,好吧,这澄清了事情。非常感谢您的帮助,尤其是因为它与 jet/access 相关,并且仅与 EF-Jet-Provider 相关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 2021-10-09
  • 2014-10-05
相关资源
最近更新 更多