public class Sample : AuditableEntity
{
public Sample(string name)
{
Name = name;
}
public int Id { get; }
public string Name { get; }
}
所以我已经移除了所有公共的 setter 方法,因此在我的代码中某个位置,当我想要检查是否存在这样的示例时
_context.Samples.Any(r => r.Name == name)
这行代码导致了错误:System.InvalidOperationException:'没有适合实体类型“Sample”的构造函数。以下构造函数具有无法绑定到实体类型属性的参数:无法在'Sample(string name)'中绑定'name'。
。
因此,我添加了一个空构造函数的代码。
public class Sample : AuditableEntity
{
public Sample() { } // Added empty constructor here
public Sample(string name)
{
Name = name;
}
public int Id { get; }
public string Name { get; }
}
现在这行代码会导致错误:System.InvalidOperationException:“LINQ 表达式'DbSet<Sample>.Any(s => s.Name == __name_0)'无法翻译。请将查询重写为可以翻译的形式,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 之一的调用来显式地切换到客户端评估。有关更多信息,请参见 https://go.microsoft.com/fwlink/?linkid=2101038。”
。
但是如果我给Name
添加私有设置(或公共),那么一切都能正常工作(即使没有空构造函数)。
public class Sample : AuditableEntity
{
public Sample(string name)
{
Name = name;
}
public int Id { get; }
public string Name { get; private set; } // added setter, removed empty constructor
}
有人能够解释一下为什么这个setter是必需的吗?比如,Id属性并不需要这个setter。
EF
使用反射来初始化新对象。这样,private setter
就可以像 public setter 一样通过反射调用。 - Farhad Jabiyev