【发布时间】:2022-01-10 04:36:36
【问题描述】:
我对 EF Core 6.0 还是很陌生。我们目前有一个要升级的项目,我们无法更改实际的表(由另一个程序使用),所以我们使用数据库优先方法。 所以我需要为用户添加一些权限(数据库是法语)我们目前有一个UsagerEW表(用户表),我们为Many2Many添加了一个权限表和一个联合表PermissionUsagerEW。在这里做 Scaffold-dbContect 后的结果是:
UsagerEW(主键是 Code_Int)
public partial class UsagerEW
{
public UsagerEW()
{
PermissionUsagerEW = new HashSet<PermissionUsagerEW>();
RefreshToken = new HashSet<RefreshToken>();
}
public string Code { get; set; }
public string Nom { get; set; }
public string Email { get; set; }
public string ModeLogin { get; set; }
public string PasswordTemp { get; set; }
public DateTime? PasswordTempExp { get; set; }
public int code_int { get; set; }
public virtual ICollection<PermissionUsagerEW> PermissionUsagerEW { get; set; }
}
Pemrssion 和 PermissionUsagerEW
public partial class Permission
{
public Permission()
{
PermissionUsagerEW = new HashSet<PermissionUsagerEW>();
}
public int id { get; set; }
public string code { get; set; }
public string description { get; set; }
public int? moduleId { get; set; }
public virtual Module module { get; set; }
public virtual ICollection<PermissionUsagerEW> PermissionUsagerEW { get; set; }
}
public partial class PermissionUsagerEW
{
public int id { get; set; }
public int permissionId { get; set; }
public int usagerCodeInt { get; set; }
public virtual Permission permission { get; set; }
public virtual UsagerEW usagerCodeIntNavigation { get; set; }
}
编译后,我可以从 UsagerEW 中“使用包含导航”并获取特定 UsagerEW 的 PermissionUsagerEW 列表。
现在就像我在应该支持 Many2Many 的 EF COre 6.0 我在 Permnission 类中添加了这个导航属性
public virtual ICollection<UsagerEW> UsagerEW { get; set; }
这在 UsagerEW 类中:
public virtual ICollection<Permission> Permission { get; set; }
但是我得到了执行错误,我只是尝试加载一些用户 wintout 任何包括:
UsagerEW user = _EWContext.UsagerEW.Where(u=>u.Code == usagerId).SingleOrDefault();
System.InvalidOperationException: '不能使用表 实体类型“PermissionUsagerEW”的“PermissionUsagerEW” (Dictionary
)' 因为它被用于实体类型 'PermissionUsagerEW' 和可能的其他实体类型,但有 没有链接关系。将外键添加到 'PermissionUsagerEW (Dictionary )' 在主键属性和 指向映射到的另一个实体类型上的主键 'PermissionUsagerEW'。'
脚手架检测FK:
modelBuilder.Entity<PermissionUsagerEW>(entity =>
{
entity.HasOne(d => d.permission)
.WithMany(p => p.PermissionUsagerEW)
.HasForeignKey(d => d.permissionId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_PermissionUsager_Permission");
entity.HasOne(d => d.usagerCodeIntNavigation)
.WithMany(p => p.PermissionUsagerEW)
.HasForeignKey(d => d.usagerCodeInt)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_PermissionUsager_Usager");
});
有什么想法吗?
---编辑 1 我更改了您的代码以反映脚手架 PermissionUsagerEW 表:
//--UsagewrEW
modelBuilder.Entity<UsagerEW>()
.HasKey(u => u.code_int);
modelBuilder.Entity<UsagerEW>()
.HasMany(u => u.Permissions)
.WithMany(p => p.Users)
.UsingEntity<PermissionUsagerEW>(
p => p.HasOne(e => e.permission)
.WithMany()
.HasForeignKey(e => e.permissionId),
p => p.HasOne(p => p.usagerCodeIntNavigation)
.WithMany()
.HasForeignKey(e => e.usagerCodeInt)
);
modelBuilder.Entity<PermissionUsagerEW>()
.HasOne(p => p.usagerCodeIntNavigation)
.WithMany()
.HasForeignKey(p => p.usagerCodeInt);
当使用 UsagerEW user = _EWContext.UsagerEW.Where(u=>u.Code == usagerId).Include(u => u.Permissions).SingleOrDefault();
现在我收到了这个错误:
Microsoft.Data.SqlClient.SqlException: '无效的列名 'UsagerEWcode_int'。'
我认为 EF 会尝试自动链接某些内容。我的解决方案中没有任何 UsagerEWcode_int。
编辑2: 有生成的SQL。奇怪的列名和一些重复......
SELECT [u].[code_int], [u].[Administrateur], [u].[Code], [u].[Email], [u].[EmpContact], [u].[Inactif], [u].[KelvinConfig], [u].[LectureSeule], [u].[ModeLogin], [u].[Nom], [u].[ParamRole], [u].[Password], [u].[PasswordTemp], [u].[PasswordTempExp], [u].[RestreintCommContrat], [u].[RestreintProjet], [u].[Role], [u].[UsagerAD], [u].[doitChangerPW], [u].[estSuperviseur], [u].[idSuperviseur], [u].[infoSession], [u].[paramRole2], [u].[permsGrps], [t].[id], [t].[Permissionid], [t].[UsagerEWcode_int], [t].[permissionId0], [t].[usagerCodeInt], [t].[id0], [t].[code], [t].[description], [t].[moduleId]
FROM [UsagerEW] AS [u]
LEFT JOIN (
SELECT [p].[id], [p].[Permissionid], [p].[UsagerEWcode_int], [p].[permissionId] AS [permissionId0], [p].[usagerCodeInt], [p0].[id] AS [id0], [p0].[code], [p0].[description], [p0].[moduleId]
FROM [PermissionUsagerEW] AS [p]
INNER JOIN [Permission] AS [p0] ON [p].[permissionId] = [p0].[id]
) AS [t] ON [u].[code_int] = [t].[usagerCodeInt]
WHERE [u].[Code] = @__usagerId_0
ORDER BY [u].[code_int], [t].[id]
【问题讨论】:
-
这个
modelBuilder.Entity<PermissionUsagerEW>()是不必要的,并且会导致虚假列。p => p.usagerCodeIntNavigation已在上一条语句中配置。
标签: entity-framework