簡體   English   中英

實體框架6.1-為新記錄的插入分配源關鍵原因

[英]entity framework 6.1 - assign a forigen key cause to an insertion of new record

我看到過類似的帖子,但沒有找到答案。 我有EF 6.1的WPF 4.5應用程序。

這是我的數據模型的一部分:

[Key]
[Required]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }

[Required]
[StringLength(32)]
public string FileDisplayName { get; set; }

[Required]
[StringLength(32)]
public string FileName { get; set; }

[Required]
[StringLength(8)]
public string FileExtention { get; set; }

[StringLength(1024)]
public string Description { get; set; }

[Required]
[StringLength(1024)]
public string FilePath { get; set; }

[Required]
public DateTime UploadDate { get; set; }

[Required]
public virtual FilesTypeLookup FileType { get; set; }

[Required]
[DefaultValue(0)]
public double Amount { get; set; }

[Required]
public virtual Expenses ExpenseId { get; set; }

public virtual ExpensesCategories Category { get; set; }

public virtual ExpensesPayees Payee { get; set; }



public class ExpensesCategories
{
    [Key]
    [Required]
    public int Id { get; set; }

    [Required]
    [StringLength(64)]
    [Index(IsUnique = true)]
    public string Name { get; set; }

    [StringLength(256)]
    public string Description { get; set; }
}

如您所見, File實體具有ExpensesCategory導航屬性。 當我為此屬性分配新值時,就會發生問題。 我正在使用下一個代碼來編輯現有的File記錄:

   var fileEntity = entityToEdit.Files.Single(p => p.Id == file.Id);
                                fileEntity.Amount = file.Amount;
                                fileEntity.Category = DB.ExpensesCategories.Single(p => p.Id == file.Category.Id);
//more work here
context.SaveChanges();

SaveChanges()方法引發異常:

System.Data.Entity.Infrastructure.DbUpdateException An error occurred while updating the entries. See the inner exception for details. Int32 SaveChanges()
UpdateException An error occurred while updating the entries. See the inner exception for details. Int32 Update()
SqlException Cannot insert duplicate key row in object 'dbo.ExpensesCategories' with unique index 'IX_Name'. The duplicate key value is (חומרי יצירה).
The statement has been terminated. Void OnError(System.Data.SqlClient.SqlException, Boolean, System.Action`1[System.Action])

似乎EF試圖創建新的ExpenseCategory記錄並將其與我的現有File記錄鏈接,而不是在現有File記錄與現有ExpenseCategory之間建立關系。 唯一約束不允許這樣做,並會引發異常。

我不想EF會創建新的ExpenseCategory記錄,只想設置與現有記錄的關系( ExpenseCategory是查找表)。 我怎樣才能做到這一點?

感謝Ofir

您可以嘗試將其添加到ExpensesCategories類嗎?

public virtual ICollection<Files> Files { get; set; }

不知道這是否可以解決問題,但是仍然缺少。

如果兩個對象之間存在一對一關系,則應將以下屬性添加到ExpensesCategories

[Key, ForeignKey("File")]    
public int FileId {get;set;}

public virtual File File{ get; set;}

我認為ExpensesCatrgories和“文件”之間的關系是一對多的(一個類別可能包含文件,但每個文件都屬於一個特定的類別)。 在這種情況下,請添加

public virtual ICollection<File> Files { get; set; } 

費用分類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM