【发布时间】:2016-11-13 07:08:06
【问题描述】:
我正在使用 Entity Framework 6 和 sqlite 来存储和检索一些数据。当以下代码块运行时,db.SaveChanges() 上会引发异常。
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();
}
例外:
在EntityFramework.dll中发生'System.Data.Entity.Infrastructure.DbUpdateException'
附加信息:无法确定“RhythmRepository.Folder_ParentFolder”关系的主体端。多个添加的实体可能具有相同的主键。
据我了解,当ID直接用于外键时经常会出现这个问题,但这里似乎不是这种情况,因为“ParentFolder”的类型是“Folder”。
文件夹类型在数据库中设置为自增,具有属性:
[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)
);
【问题讨论】:
-
自加入Folder-Parentfolder的映射是什么?在一对一中,PK用作FK,由于显而易见的原因,这在这种情况下不起作用。
-
这是一对多的关系。文件夹具有对其父级的引用,并且许多文件夹可以共享同一个父级。
-
值得分享实体结构以及您如何定义关系映射。
-
已添加。我不确定最初是否需要它们。
标签: c# entity-framework sqlite