【发布时间】:2020-01-30 08:34:18
【问题描述】:
尝试在我的数据库上下文中建立多对多关系,在播种数据时出现以下错误:
无法跟踪实体类型“文件夹”的实例,因为 另一个具有键值“{Id: folder001}”的实例是 已经被追踪。附加现有实体时,请确保 只附加了一个具有给定键值的实体实例。
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<UserFolder>(userFolder =>
{
userFolder.HasKey(ud => new { ud.UserId, ud.FolderId });
userFolder.HasOne(uf => uf.Folder)
.WithMany(f => f.Users)
.HasForeignKey(uf => uf.FolderId)
.IsRequired();
userFolder.HasOne(uf => uf.User)
.WithMany(f => f.Folders)
.HasForeignKey(uf => uf.UserId)
.IsRequired();
});
}
_
public class Folder
{
public string Id { get; set; }
public string FolderName { get; set; }
public virtual ICollection<UserFolder> Users { get; set; }
}
_
public class User
{
public string Id { get; set; }
public string UserName { get; set; }
public virtual ICollection<UserFolder> Folders { get; set; }
}
_
public class UserFolder
{
public string UserId { get; set; }
public virtual User User { get; set; }
public string FolderId { get; set; }
public virtual Folder Folder { get; set; }
}
搜索此错误结果主要是关于需要使用 Scoped 而不是 Singleton 来注册服务的答案,但在这里我是这样配置我的服务的:services.AddDbContext<DataContext>,也有一些答案说需要添加 @ 987654326@.
那么我怎样才能摆脱这个错误呢?
【问题讨论】:
-
播种数据的代码是什么?
-
播种数据适用于 Role 和 UserRole,为了简洁起见,我不想在这个问题中添加太多内容,而且我已经检查了此类的数据以确保那里没有任何问题
-
为了清楚起见,重要的是要意识到在实体框架术语中,这不是多对多关系,而是三个实体之间有两个一对多关系。 EF 中的多对多关系是交叉表对开发人员不明确可见的关系(EF 在您不知道的情况下在后台执行此操作)。 EF Core 实际上并不支持多对多关系,这会妨碍您在线查找信息和解决方案的能力。
标签: c# asp.net-core entity-framework-core