2016-11-12 6 views
3

Я использую Entity Framework 6 и sqlite для хранения и извлечения некоторых данных. Когда выполняется следующий блок кода, исключение вызывается на db.SaveChanges().Первичный ключ сущности Entity Framework

using (var db = new RepoDatabase(DBPath)) 
{ 
    var folder1 = new Folder 
    { 
     Name = "name1", 
     Subtitle = "subtitle", 
     ParentFolder = null, 
     IsHidden = false, 
     IsSimple = true, 
     QueryOrFilePath = "query" 
    }; 

    var folder2 = new Folder 
    { 
     Name = "name2", 
     Subtitle = "subtitle", 
     ParentFolder = folder1, 
     IsHidden = false, 
     IsSimple = true, 
     QueryOrFilePath = "query" 
    }; 
    db.Folders.Add(folder1); 
    db.Folders.Add(folder2); 
    db.SaveChanges(); 
} 

Исключение:

'System.Data.Entity.Infrastructure.DbUpdateException' произошло в EntityFramework.dll

Дополнительная информация: Не удалось определить основной конец «RhythmRepository.Folder_ParentFolder отношения. Несколько добавленных объектов могут иметь один и тот же первичный ключ.

С моей точки зрения, эта проблема часто возникает, когда идентификатор используется непосредственно для внешних ключей, но это, похоже, не так, поскольку тип «ParentFolder» - это «Папка».

Тип папки устанавливается на автоприращение в базе данных, и имеет атрибут:

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 

Основная структура сущность:

class Folder 
{ 
    #region database fields 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int FolderID { get; set; } 
    public string Name { get; set; } 
    public string Subtitle { get; set; } 
    [ForeignKey("FolderID")] 
    public Folder ParentFolder { get; set; } 
    public bool IsHidden { get; set; } 
    public bool IsSimple { get; set; } 
    public string QueryOrFilePath { get; set; } 
    #endregion 
} 

И SQL-запрос для создания таблицы:

CREATE TABLE IF NOT EXISTS Folders 
(
    FolderID INTEGER PRIMARY KEY AUTOINCREMENT, 
    Name varchar(255) NOT NULL, 
    Subtitle varchar(255) NULL, 
    ParentFolderID INT NULL, 
    IsHidden BIT NOT NULL, 
    IsSimple BIT NOT NULL, 
    QueryOrFilePath varchar(255) NOT NULL, 
    FOREIGN KEY (ParentFolderID) REFERENCES Folders(FolderID) 
); 
+1

Что такое отображение для самостоятельной записи Папка-родительская папка? В индивидуальном порядке ПК используется как FK, и это не может работать в этом случае по очевидным причинам. – DevilSuichiro

+0

Это отношение к многим. Папки имеют ссылки на своих родителей, и многие папки могут совместно использовать одного и того же родителя. – maboesanman

+0

Стоит разделить структуру сущности и как вы определили сопоставления отношений. – Venky

ответ

3

ошибка в части

[ForeignKey("FolderID")] 
public Folder ParentFolder { get; set; } 

Это делает EF думать, что FolderID является внешним ключом для родителя Folder. На самом деле это ParentFolderID. Таким образом изменить определение класса и отображение на

class Folder 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int FolderID { get; set; } 

    public int? ParentFolderID { get; set; } 
    [ForeignKey("ParentFolderID")] 
    public Folder ParentFolder { get; set; } 

    ... 
} 

Если FolderID является внешним ключом, EF делает вывод, что существует 1: 1 связь между папкой и его родителем. Обычно ассоциация 1: 1 реализуется первичным ключом, который также является внешним ключом для родителя. I. Первичный ключ ребенка копирует первичный ключ родителя. Когда родитель и ребенок являются одним и тем же классом сущностей, две записи одной и той же таблицы должны иметь один и тот же первичный ключ - невозможно.

+0

Я думал, что атрибут внешнего ключа предназначен для указания EF, который столбцом соответствующей таблицы был первичный ключ. Предлагаемое вами изменение имеет смысл, но даже после его реализации я все равно получаю одно и то же исключение в одном и том же месте. – maboesanman

+0

Это почти все решение. недостающая часть заключается в том, что ParentFolderID должен иметь тип int? вместо int. Как только оба набора изменений были сделаны, все работает отлично – maboesanman

+0

ОК, это очевидно, конечно. Изменено. –

Смежные вопросы