【发布时间】:2016-10-10 12:49:37
【问题描述】:
我正在创建一个自定义表并使用 Identity。我也有一个向该表添加行的上下文。
代码:
public class UserRoleAccess
{
[Key]
public string Id { get; set; }
public string UserRoleId { get; set; }
[ForeignKey("Id")]
public virtual ApplicationRole ApplicationRole { get; set; }
public bool IsActive { get; set; }
public string Name { get; set; }
public int UserRoleAccessType { get; set; }
}
数据库上下文:
public class UserRoleAccessContext : DbContext
{
public UserRoleAccessContext() : base("DMConnection")
{
Database.SetInitializer<PersonContext>(null);
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
}
public static UserRoleAccessContext Create()
{
return new UserRoleAccessContext();
}
public DbSet<UserRoleAccess> UserRoleAccess { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
//modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
// IMPORTANT: we are mapping the entity User to the same table as the entity ApplicationUser
//modelBuilder.Entity<IdentityUserLogin>().ToTable("Users").HasKey(e => e.UserId);
}
public DbQuery<T> Query<T>() where T : class
{
return Set<T>();
}
}
绑定:
protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
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<UserRoleAccess>().HasRequired(p => p.ApplicationRole)
.WithMany(b => b.UserRoleAccess);
modelBuilder.Entity<UserRoleAccess>().HasRequired(p => p.ApplicationRole)
.WithMany(b => b.UserRoleAccess)
.HasForeignKey(p => p.UserRoleId);
}
出现错误时执行此代码:
public static void CreateUserRoleAccess(string name, int type, string id)
{
var userAccessContext = new UserRoleAccessContext();
var userRoleAccess = new UserRoleAccess();
userRoleAccess.UserRoleId = id;
userRoleAccess.IsActive = true;
userRoleAccess.UserRoleAccessType = type;
userRoleAccess.Name = name;
userAccessContext.UserRoleAccess.Add(userRoleAccess);
}
错误:
在模型生成过程中检测到一个或多个验证错误:
Project.Models.IdentityUserRole: : EntityType 'IdentityUserRole' 有 没有定义键。定义此 EntityType 的键。身份用户角色: EntityType:EntitySet 'IdentityUserRoles' 基于类型 没有定义键的“IdentityUserRole”。
我假设我在某处缺少绑定,但我不知道在哪里?
编辑: 我更改了 UserRoleAccess 类。我将 Id 从 string 更改为 long 并且 我在 TSQL 中试过这个
INSERT INTO UserRoleAccess (UserRoleId,IsActive, Name, UserRoleAccessType) VALUES('e5b2e76a-a106-4076-b219-6987411995e7', 1, 'TEST', 1)
成功了。虽然我从我的应用程序运行它时仍然遇到同样的错误
编辑 2 在我的绑定中添加了这个:
modelBuilder.Entity<IdentityRole>().HasKey<string>(r => r.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { r.RoleId, r.UserId });
还是一样的结果
【问题讨论】:
-
它说您的班级
Project.Models.IdentityUserRole没有定义密钥。你能显示类定义吗? -
试过了,没用。
-
EntityType 'xxxx' has no key defined错误通常是由于并非所有表都具有模型上的KeyAttribute定义的主键。在所有表部分类的主键上设置KeyAttribute,并确保绑定工作正常。
标签: c# asp.net-mvc entity-framework ef-code-first