【发布时间】:2017-02-19 22:47:41
【问题描述】:
首先使用实体框架代码。
尝试使用 IdentityRole id 作为自定义类的外键。
关系是正确的,但是当我尝试将数据添加到我的自定义表时,我得到了这个错误。
EntityType 'IdentityUserRole' 没有定义键。定义键 此实体类型。 IdentityUserRoles:EntityType:EntitySet 'IdentityUserRoles' 基于类型 'IdentityUserRole' 没有 已定义键。
代码:
自定义表/类
public class UserRoleAccess
{
[Key]
public long UserRoleAccessId { get; set; }
public string UserRoleId { get; set; }
public virtual ApplicationRole ApplicationRole { get; set; }
public bool IsActive { get; set; }
public string Name { get; set; }
public int UserRoleAccessType { get; set; }
}
身份角色:
public class ApplicationRole : IdentityRole
{
public virtual ICollection<UserRoleAccess> UserRoleAccess { get; set; }
}
绑定:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<IdentityUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
modelBuilder.Entity<ApplicationUser>().ToTable("Users").Property(p => p.Id).HasColumnName("UserId");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<ApplicationRole>().ToTable("Roles");
modelBuilder.Entity<UserRoleAccess>().ToTable("UserRoleAccess");
modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person)
.WithMany(b => b.Users);
modelBuilder.Entity<ApplicationUser>().HasRequired(p => p.Person)
.WithMany(b => b.Users)
.HasForeignKey(p => p.PersonId);
modelBuilder.Entity<IdentityUserLogin>().HasKey<string>(l => l.UserId);
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<ApplicationRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
}
数据库中的关系(正确):
尝试创建一个 id 属性并设置一个 [Key] 属性,但没有成功:
public class ApplicationRole : IdentityRole
{
[Key]
public string Id { get; set; }
public virtual ICollection<UserRoleAccess> UserRoleAccess { get; set; }
}
添加数据时运行此代码:
public static void CreateUserRoleAccess(string name, int type, string id)
{
using (var context = new UserRoleAccessContext())
{
var userRoleAccess = new UserRoleAccess();
userRoleAccess.ApplicationRole = new ApplicationRole { Id = id };
userRoleAccess.UserRoleId = id;
userRoleAccess.IsActive = true;
userRoleAccess.UserRoleAccessType = type;
userRoleAccess.Name = name;
context.UserRoleAccess.Add(userRoleAccess);
context.SaveChanges();
}
}
我错过了什么?
编辑:
IdentityRole 类:
【问题讨论】:
-
我们不会在 ObjectType 之前使用 new 关键字,是吗?公共新字符串 ID { 获取;放; }
-
@Waleed 重新添加了一些东西。你的评论有什么帮助?属性前加或不加new关键字还是不行
-
你能发布 IdentityRole 类吗?您在模型构建器中有一个到 IdentityRole 键的映射
-
@matthijsb 它是内置的 Ef 类:msdn.microsoft.com/en-us/library/dn613249(v=vs.108).aspx
-
错误消息指出错误是关于实体 IdentityUserRole,而不是关于 IdentityRole。您的映射未定义此实体与其他实体之间的关系,因此 EF 可能正在为该实体隐式创建关系。 PK 是否在“UserRoles”表中的数据库中生成?能否展示实体 IdentityUserRole 的代码?
标签: c# entity-framework asp.net-mvc-5 ef-code-first