我正在处理一个 ASP.NET 3.1 项目。
类(class)EmployeeSummary
包含公共(public)属性(property) string[] Roles
public string[] Roles { get; set; }
并为字符串数组设置了值转换器:
modelBuilder.Entity<EmployeeSummary>()
.Property(e => e.Roles)
.HasConversion(v => string.Join(",", v),
v => v.Split(new[]
{
","
}, StringSplitOptions.RemoveEmptyEntries)
.ToList()
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray());
我得到以下 System.InvalidOperationException
表示我没有设置值比较器:
The property 'Roles' on entity type 'EmployeeSummary' is a collection or enumeration type
with a value converter but with no value comparer.
Set a value comparer to ensure the collection/enumeration elements are compared correctly.
我的方法是添加(类似于 Microsoft documentation 中的示例)
- A
var valueComparer
在类里面EmployeeSummary
- 设置为
new ValueComparer<string[]>
而不是new ValueComparer<List<int>>
- 检查两个数组是否相同。 然而,这不起作用:
public string[] Roles { get; set; }
private var valueComparer = new ValueComparer<string[]>(
(c1, c2) => c1.SequenceEqual(c2));
带有无法解析构造函数的消息。这是正确的方法吗,或者我该如何解决此错误消息?
最佳答案
您需要在方法HasConversion
中设置ValueComparer
。
一个可行的例子是:
modelBuilder.Entity<EmployeeSummary>()
.Property(e => e.Roles)
.HasConversion(
v => string.Join(',', v),
v => v.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList()
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToArray(), new ValueComparer<ICollection<string>>(
(c1, c2) => c1.SequenceEqual(c2),
c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())),
c => c.ToList()));
关于c# - 如何使用 Entity Framework `ValueComparer<T>` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64595477/