Entity Framework 尝试 FindByName 时标识列名称“*_ID”无效
Entity Framework Identity invalid column name "*_ID" when try to FindByName
我基于 Identity Framework 创建了我的应用程序,并创建了一个接口 ApplicationUser
以将 User_ID
类型设置为 GUID。一切正常,但是当我尝试使用 UserManager
class 加载用户时,出现了一个我无法理解的异常。我不明白为什么要在命令中添加此列
异常:
ORA-00904: "Extent1"."ApplicationUser_Id": identificador inválido
导致异常的命令:
SELECT
"Extent1"."ID_USER_CLAIM" AS "ID_USER_CLAIM",
"Extent1"."ID_USER" AS "ID_USER",
"Extent1"."CLAIM_TYPE" AS "CLAIM_TYPE",
"Extent1"."CLAIM_VALUE" AS "CLAIM_VALUE",
"Extent1"."ApplicationUser_Id" AS "ApplicationUser_Id"
FROM
"BEECORE"."ADM_USER_CLAIM" "Extent1"
WHERE
("Extent1"."ID_USER" = :p__linq__0)
代码:
var user = userService.UserManager.FindByName(model.UserName);
应用程序用户:
using Microsoft.AspNet.Identity.EntityFramework;
using System;
namespace Bee.Core.Domain.Identity
{
public class ApplicationUser : IdentityUser<Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationUser()
{
Id = Guid.NewGuid();
}
public ApplicationUser(string name) : this() { UserName = name; }
}
}
配置:
using Bee.Core.Domain.Identity;
using System.Data.Entity.ModelConfiguration;
namespace Bee.Core.Administration.Data.EntityConfig.Identity
{
public class IdentityUserConfiguration : EntityTypeConfiguration<ApplicationUser>
{
public IdentityUserConfiguration()
{
ToTable("ADM_USER");
HasKey(c => new
{
c.Id
});
Property(c => c.Id).HasColumnName("ID_USER");
Property(c => c.Email).HasColumnName("EMAIL");
Property(c => c.EmailConfirmed).HasColumnName("EMAIL_CONFIRMED");
Property(c => c.PasswordHash).HasColumnName("PASSWORD_HASH");
Property(c => c.SecurityStamp).HasColumnName("SECURITY_STAMP");
Property(c => c.PhoneNumber).HasColumnName("PHONE_NUMBER");
Property(c => c.PhoneNumberConfirmed).HasColumnName("PHONE_NUMBER_CONFIRMED");
Property(c => c.TwoFactorEnabled).HasColumnName("TWO_FACTOR_ENABLED");
Property(c => c.LockoutEndDateUtc).HasColumnName("LOCKOUT_ENDDATEUTC");
Property(c => c.LockoutEnabled).HasColumnName("LOCKOUT_ENABLED");
Property(c => c.AccessFailedCount).HasColumnName("ACCESS_FAILED_COUNT");
Property(c => c.UserName).HasColumnName("USER_NAME");
}
}
}
我在实施自定义 Microsoft Identity 时遇到了同样的问题。在这种情况下,我需要在 EntityTypeConfiguration 中为每个 Identity class/table.
显式配置所有外键
例如,您的代码需要进入 class 用户(继承 - IdentityUser):
HasMany(x => x.Claims)
.WithRequired(y => y.ApplicationUser);
HasMany(x => x.Roles)
.WithRequired(y => y.ApplicationUser);
HasMany(x => x.Logins)
.WithRequired(y => y.ApplicationUser);
您需要使用外键配置所有 class Microsoft 身份:
Class UserClaim(继承 - IdentityUserClaim):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Claims)
.HasForeignKey(f => f.UserId);
Class 角色(继承 - IdentityRole):
HasMany(c => c.Users).WithRequired().HasForeignKey(c => c.RoleId);
Class UserLogin(继承 - IdentityUserLogin):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Logins)
.HasForeignKey(f => f.UserId);
Class UserRole(继承 - IdentityUserRole):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Roles)
.HasForeignKey(f => f.UserId);
希望对你有所帮助
我基于 Identity Framework 创建了我的应用程序,并创建了一个接口 ApplicationUser
以将 User_ID
类型设置为 GUID。一切正常,但是当我尝试使用 UserManager
class 加载用户时,出现了一个我无法理解的异常。我不明白为什么要在命令中添加此列
异常:
ORA-00904: "Extent1"."ApplicationUser_Id": identificador inválido
导致异常的命令:
SELECT
"Extent1"."ID_USER_CLAIM" AS "ID_USER_CLAIM",
"Extent1"."ID_USER" AS "ID_USER",
"Extent1"."CLAIM_TYPE" AS "CLAIM_TYPE",
"Extent1"."CLAIM_VALUE" AS "CLAIM_VALUE",
"Extent1"."ApplicationUser_Id" AS "ApplicationUser_Id"
FROM
"BEECORE"."ADM_USER_CLAIM" "Extent1"
WHERE
("Extent1"."ID_USER" = :p__linq__0)
代码:
var user = userService.UserManager.FindByName(model.UserName);
应用程序用户:
using Microsoft.AspNet.Identity.EntityFramework;
using System;
namespace Bee.Core.Domain.Identity
{
public class ApplicationUser : IdentityUser<Guid, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationUser()
{
Id = Guid.NewGuid();
}
public ApplicationUser(string name) : this() { UserName = name; }
}
}
配置:
using Bee.Core.Domain.Identity;
using System.Data.Entity.ModelConfiguration;
namespace Bee.Core.Administration.Data.EntityConfig.Identity
{
public class IdentityUserConfiguration : EntityTypeConfiguration<ApplicationUser>
{
public IdentityUserConfiguration()
{
ToTable("ADM_USER");
HasKey(c => new
{
c.Id
});
Property(c => c.Id).HasColumnName("ID_USER");
Property(c => c.Email).HasColumnName("EMAIL");
Property(c => c.EmailConfirmed).HasColumnName("EMAIL_CONFIRMED");
Property(c => c.PasswordHash).HasColumnName("PASSWORD_HASH");
Property(c => c.SecurityStamp).HasColumnName("SECURITY_STAMP");
Property(c => c.PhoneNumber).HasColumnName("PHONE_NUMBER");
Property(c => c.PhoneNumberConfirmed).HasColumnName("PHONE_NUMBER_CONFIRMED");
Property(c => c.TwoFactorEnabled).HasColumnName("TWO_FACTOR_ENABLED");
Property(c => c.LockoutEndDateUtc).HasColumnName("LOCKOUT_ENDDATEUTC");
Property(c => c.LockoutEnabled).HasColumnName("LOCKOUT_ENABLED");
Property(c => c.AccessFailedCount).HasColumnName("ACCESS_FAILED_COUNT");
Property(c => c.UserName).HasColumnName("USER_NAME");
}
}
}
我在实施自定义 Microsoft Identity 时遇到了同样的问题。在这种情况下,我需要在 EntityTypeConfiguration 中为每个 Identity class/table.
显式配置所有外键例如,您的代码需要进入 class 用户(继承 - IdentityUser):
HasMany(x => x.Claims)
.WithRequired(y => y.ApplicationUser);
HasMany(x => x.Roles)
.WithRequired(y => y.ApplicationUser);
HasMany(x => x.Logins)
.WithRequired(y => y.ApplicationUser);
您需要使用外键配置所有 class Microsoft 身份:
Class UserClaim(继承 - IdentityUserClaim):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Claims)
.HasForeignKey(f => f.UserId);
Class 角色(继承 - IdentityRole):
HasMany(c => c.Users).WithRequired().HasForeignKey(c => c.RoleId);
Class UserLogin(继承 - IdentityUserLogin):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Logins)
.HasForeignKey(f => f.UserId);
Class UserRole(继承 - IdentityUserRole):
HasRequired(x => x.ApplicationUser)
.WithMany(y => y.Roles)
.HasForeignKey(f => f.UserId);
希望对你有所帮助