一个主键映射到多个表作为外键EntityFrameworkCore

时间:2019-08-29 09:55:44

标签: entity-framework-core

我有一个表API,其中有两个文件密钥和URL。键是主键。另一个具有APIKey(FK)和ActionKey(String)的表API_Action。 APIKey是API表的PrimaryKey,ActionKey是主键。我有另一个表Permission,其中包含APIKey(FK),Name,Description,Key之类的列。 APIKey是API表的主键。

我想使用entityFramework核心存储数据。但这给了我错误。

<code>
public class API
{
   public string Key { get; set; }
   public string ServiceUri { get; set; }
   public virtual List<Action> Actions { get; set; } = new List<Action>();
   public virtual List<PermissionType> PermissionTypes { get; set; } = new List<PermissionType>();
}
public class Action
{
   public string ActionKey { get; set; }
   public string APIKey { get; set; }
   public virtual API API { get; set; }
}
public class PermissionType
{
   public string APIKey { get; set; }
   public string Key { get; set; }
   public string Name { get; set; }
   public string Description { get; set; }
   public virtual API API { get; set; } 
}
</code>

我使用FluentAPI定义了关系。

<code>
modelBuilder
.Entity<Models.System.API>(b => b.ToTable("tbl_System_API").HasKey(o => o.Key))
            .Entity<Models.System.Action>(b => b.ToTable("tbl_System_API_Action").HasKey(o => new { o.ActionKey, o.APIKey }))
            .Entity<Models.System.Action>(b => b.ToTable("tbl_System_API_Action").HasOne(o => o.API).WithMany(o => o.Actions).HasForeignKey(o => o.APIKey))
.Entity<PermissionType>(b => b.ToTable("tbl_System_PermissionType").HasKey(o => o.Key))
            .Entity<PermissionType>(b => b.ToTable("tbl_System_PermissionType").HasOne(o => o.API).WithMany(o => o.PermissionTypes).HasForeignKey(o => o.APIKey))
</code>

保存时我正在使用

<code>
foreach (var api in apis)
{
   var actionss = actions.Where(o => o.APIKey == api.Key).ToList();
   api.Actions.AddRange(actionss);
}
foreach (var api in apis)
{
   var permissionTypess = permissionTypes.Where(o => o.APIKey == api.Key).ToList();
   api.PermissionTypes.AddRange(permissionTypess);
}

dataContext.APIs.AddRange(apis);
dataContext.Save();
</code>

我遇到了错误。 无法跟踪实体类型“ PermissionType”的实例,因为已经跟踪了另一个具有相同{{APIKey'}的键值的实例。附加现有实体时,请确保仅附加一个具有给定键值的实体实例。考虑使用'DbContextOptionsBuilder.EnableSensitiveDataLogging'查看冲突的键值。

我想将父表和子表与FK关系一起存储。

因此,API表应具有值,并且Action和PermissionType表应使用API​​表和其他字段的FK填充。

0 个答案:

没有答案
相关问题