我正在将实体框架与 MongoDB 结合使用。但是,我在尝试使用
FirstOrDefault
时遇到了问题。
我有一个基类,
SignInCredentials
:
public class SignInCredentials(string username, string? password)
{
public string Username { get; set; } = username;
public string? Password { get; protected init; } = password;
}
我用
Account
扩展它:
public class Account : SignInCredentials
{
// [Key] sets the primary key
[Key]
public ObjectId Id { get; private init; }
private readonly byte[] salt;
public Account(string username, string password) : base(username, null)
{
Id = new ObjectId();
salt = GenerateSalt();
Password = Hash(password, salt);
}
// More code not displayed
}
我存储了一个
DbSet<Account>
,其配置为:
modelBuilder.Entity<Account>().ToCollection("accounts");
但是,当我尝试:
accounts.FirstOrDefault(a => a.Username == creds.Username);
,其中creds
是SignInCredentials
时,我收到以下错误:
System.ArgumentException: Expression must be writeable (Parameter 'left')
at System.Linq.Expressions.Expression.RequiresCanWrite(Expression expression, String paramName)
at System.Linq.Expressions.Expression.Assign(Expression left, Expression right)
at System.Linq.Expressions.Expression.MakeBinary(ExpressionType binaryType, Expression left, Expression right, Boolean liftToNull, MethodInfo method, LambdaExpression conversion)
at System.Linq.Expressions.BinaryExpression.Update(Expression left, LambdaExpression conversion, Expression right)
at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
at MongoDB.EntityFrameworkCore.Query.Visitors.ProjectionBindingRemovingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
如何修复此错误?
报告了类似的问题:EfCore 8:JSON 文档中的原始集合与 init 发生错误。
您应该申请
set
而不是 init
。
public string? Password { get; protected set; } = password;
或者您必须将 EF Core 更新到 8.0.1 及更高版本。