c# - 如何更改作为与其自身的一对一关系创建的记录 Entity Framework 7 (ASP.NET Core)?

标签 c# asp.net-core asp.net-core-mvc entity-framework-core

我使用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/

相关文章:

c# - 在 .NET 中使用 Blowfish 加密

c# - 您必须添加对程序集 mscorlib 的引用,version=4.0.0

c# - 在 Docker 中创建新的 ASP.NET Core MVC 应用程序时,NuGet 包恢复速度极慢

asp.net-web-api - 调用 web api PUT FromBody "value"始终为 null

asp.net-core-mvc - 将 IdentityServer4 映射到 "/identity",然后映射 UI

asp.net-mvc - 如何从 helper/service 访问 ViewContext,通过 ViewImports @injected

xml - 如何在 .net Core MVC 中读取 XML 文件?

c# - 我如何在我的项目中解决初始化字符串的格式不符合从索引 17' 开始的规范

c# - 在 C# 脚本 Azure Function 中使用 ServiceBus 作为输出参数

c# - linq 中的数据透视表