EF迁移正在使用null

问题描述

我有一个类似于以下的用户和密码模型。密码模型是新的,用户模型上的密码属性也是新的。

public class Password {
    public int PasswordID { get; set; }
    public string HashedPassword { get; set; }
    public DateTime LastUpdated { get; set; }
}

public class User {
    public int UserID { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public Password Password { get; set; }
}

我正在尝试更新EF迁移,该迁移将使用现有用户并使用新的Password外键相应地更新他们,同时还在Password表中创建相应的行。我的configuration.cs看起来像这样...

var Users = new List<User> {
    new User() { Name = "Donald",Surname = "Duck",Password = new Password() { HashedPassword = "somehashedstring",LastUpdated = DateTime.Now }},...
}

Users.ForEach(a => context.Users.AddOrUpdate(b => new { b.Name,b.Surname },a));
context.SaveChanges();

编辑:显然,“名称”和“姓氏”组合不应将行定义为唯一行,但暂时可以。这不是生产应用程序。

但是我发现在运行update-database之后,SQL中的最终用户表在Password_PasswordID列中包含NULL,并且Password表为空。我觉得我已经按照文档和指南进行操作了,但是显然我一定在某个地方出错了。如果您需要任何其他信息,请询问!

任何帮助将不胜感激。

解决方法

我尝试将其作为注释,但是我的声誉很低,因此希望对您的代码有所帮助。 我最近完成了类似您的任务,并成功完成了任务。

从视觉上看,用户和密码模型对我来说是正确的。因此,我建议调试一下:

首先-检查外键是否按EF迁移和EF更新数据库命令的预期生成。我在Visual Studio中使用SQL Server对象资源管理器进行检查。 检查这篇文章中DepartmentId的图像 big O notation

第二-这是我针对您的案例的DatabaseSeeder类,但我尚未对其进行编译。如果这对您有用,那么您可以尝试将其缩短。

public static class DatabaseSeeder
    {
        public static void SeedData(AppDbContext context)
        {
            if (context.User.Any(m => m.FooId == "foo"))
            {
                // or any checks to avoid overwriting your data - Optional
                return;
            }

            var userA = new User
            {
                Name = "Donald",Surname = "Duck",Password = new Password
                {
                    HashedPassword = "somehashedstring",LastUpdated = DateTime.Now
                }
            };

            var userB = new User
            {
                Name = "DonaldB",Surname = "DuckB",LastUpdated = DateTime.Now
                }
            };

            var users = new List<User>
            {
                userA,userB
            };

            context.Partners.AddRange(users);

            context.SaveChanges();
        }

    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...