2017-06-30 36 views
1

我問了一個類似的問題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; }   
} 

ETA:

我有變化public int BookNumber { get; set; }public int? BookNumber { get; set; }這並不解決問題。

+0

如果主鍵是自動編號字段,則唯一的其他唯一索引位於BookNumber上,因此您正在創建重複的BookNumber值。在這段代碼中並不清楚它發生的地方。可能存在與BookNumber在模型中不可空並且在數據庫可空的問題。 – bubi

+0

我改變了'公衆int BookNumber {得到;組; }'到'公衆詮釋? BookNumber {get;組; }這不能解決問題。如果有幫助,我可以向您發送源代碼和訪問數據庫。 – TheColonel26

+0

如果你給我一個可編輯的例子(也有數據),我可以檢查它 – bubi

回答

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允許重複空值。如果你允許使用不同的數據庫,你可能會遇到問題。

+0

頁面列未在數據庫中列爲唯一或索引,但仍然收到此錯誤。如果你在訪問中打開數據庫文件,你可以看到這個。順便說一下,數據庫的密碼是「SEEME」 – TheColonel26

+1

問題出在索引Name和NameDesc上。它們都是複合獨特索引。 *編輯*:你可以嘗試在Microsoft Access中做同樣的事情,你會收到同樣的錯誤。 – bubi

+0

Name和NameDesc在哪個表中?它不在內容表中。 – TheColonel26