我希望使用密码 struct ,而不是使用名为PasswordHashPasswordSalt的两个属性(我仍然希望将它们作为USERS表上的列).但我似乎找不到一种用EF Core实现它的方法.

public class User
{
    /* other properties */

    public Password Password { get; set; }
}
public readonly struct Password
    : IEquatable<Password>
{
    public string Hash { get; }
    public string Salt { get; }

    public Password(string hash, string salt)
    {
        Hash = hash;
        Salt = salt;
    }

    public bool Equals(Password other)
    {
        return Hash == other.Hash && Salt == other.Salt;
    }

    public override bool Equals(object? obj)
    {
        return obj is Password other && Equals(other);
    }

    public override int GetHashCode()
    {
        return HashCode.Combine(Hash, Salt);
    }

    public static bool operator ==(Password left, Password right) => left.Equals(right);
    public static bool operator !=(Password left, Password right) => !left.Equals(right);
}

我知道,如果我这样做,它会奏效:

public record Password(string Hash, string Salt);

但是,我希望它使用readonly个属性.其 idea 是,在更新密码时,您必须同时更改散列和SALT.它不是为了安全,而是为了抽象和更干净的代码.

我试着用OwnsOne的方法.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>(entity =>
    {
        entity.OwnsOne(navigationExpression: u => u.Password, buildAction: navigationBuilder =>
        {
            navigationBuilder.Property(p => p.Salt).HasColumnName("PasswordSalt");
            navigationBuilder.Property(p => p.Hash).HasColumnName("PasswordHash");
        });
    });

    base.OnModelCreating(modelBuilder);
}

推荐答案

Steve Py的 comments :

EF Core8同时支持不可变的记录和 struct 构造,我不确定它们是否与Owner一起工作,但实际上,由Hash+Salt组成的密码是受支持的复杂类型的用例,而不是Owner关系.见(learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew中的"不可变记录")

Csharp相关问答推荐

无法使用并行库并行化我的代码

System.Data.SQLite:判断SQLite数据库是否为空(任何表中至少有一行)

下拉图片点击MudBlazor

C#相同名称的枚举方法和normal方法,参数类型不同

将XPS转换为PDF C#

.NET 6控制台应用程序,RabbitMQ消费不工作时,它的程序文件中的S

ASP.NET核心REST API返回一个非常大的数字

如何使用新的Microsoft.IdentityModel.JsonWebToken创建JwtSecurityToken?

当前的文化决定了错误的文化

异步实体框架核心查询引发InvalidOperation异常

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

使用CollectionView时在.NET Maui中显示数据时出现问题

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

System.NotSupportdException:流不支持读取

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

将两个for循环更改为一条LINQ语句

为什么连接到Google OAuth2后,结果.Credential为空?

同时通过多个IEumable<;T&>枚举

默认架构不存在EF核心迁移