我使用EntityFramework 7 RC1
在项目中ASP.NET 5 MVC 6 RC 1
我不工作改变角色(每个角色都有一个父角色)。下面是我正在尝试做的事情的简化示例。此代码运行成功并且不会导致错误。
var roleDb = roleManager.FindByNameAsync("UserRole").Result;
var searchRoleDb = roleManager.FindByNameAsync("AdminRole").Result;
if (roleDb != null)
{
roleDb.DateEdit = DateTime.Now;
if (searchRoleDb != null)
{
roleDb.Parent = searchRoleDb;
}
context.Entry(roleDb).State = EntityState.Modified;
context.SaveChanges();
}
但是数据库中的ParentId字段仍然为空。
public class ApplicationRole : IdentityRole
{
...
public string ParentId { get; set; }
public virtual ApplicationRole Parent { get; set; }
...
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser, ApplicationRole, string>
{
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<ApplicationRole>()
.HasOne(c => c.Parent)
.WithMany()
.HasForeignKey(c => c.ParentId);
}
}
我还成功更改了数据库中的其他数据,并且成功使用了数据迁移。
我不能只更改 ParentId 值。
最佳答案
正如我在最初的评论中提到的,在对角色进行更改时,您应该使用 asp.net Identity RoleManager 类,因为您在更改过程中使用它来检索角色。您可以使用您的上下文手动/直接执行此操作,但这实际上绕过了 asp.net 身份。以下是使用 RoleManager 执行更新的原始示例的更新版本:
public async Task UpdateRole()
{
var roleDb = await roleManager.FindByNameAsync("UserRole");
var searchRoleDb = await roleManager.FindByNameAsync("AdminRole");
if (roleDb != null)
{
roleDb.DateEdit = DateTime.Now;
if (searchRoleDb != null)
{
roleDb.Parent = searchRoleDb;
}
await roleManager.UpdateAsync(roleDb);
}
}
我还更新了 FindByNameAsync 调用以使用“await”而不是“.Result”,以避免我提到的潜在死锁问题。然而,要使其起作用,方法签名必须返回一个任务并包含“async”修饰符。如需有关异步内容的帮助,我建议从 here 开始
编辑
根据有关播种的评论,我通常会这样播种我的角色:
internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
protected override void Seed(MyDbContext context)
{
SeedRoles(context);
}
private static void SeedRoles(MyDbContext context)
{
var manager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));
CreateRoleIfNotExists(manager, "Role1");
CreateRoleIfNotExists(manager, "Role2");
}
private static void CreateRoleIfNotExists(RoleManager<IdentityRole> manager, string role)
{
if (!manager.RoleExists(role)
{
manager.Create(new IdentityRole(role));
}
}
}
您需要使用 Context、User 和 Role 类更新代码,因为我刚刚使用了默认值。
无需显式保存更改,因为这是在对 Seed() 的调用返回/完成时由 DbContext 类完成的。使用这种方法,没有异步调用,因此您无需担心我提到的任何与此相关的问题。
关于c# - 如何更改作为与其自身的一对一关系创建的记录 Entity Framework 7 (ASP.NET Core)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36863878/