【发布时间】:2020-10-08 10:04:27
【问题描述】:
我对 .NET 和 EF Core 还很陌生,我正在构建一个分类列表类型的应用程序。我想比较记录并根据标签(通过实体框架中的多对多关系链接)找到匹配的通缉/待售分类。
首先,我试图确保用户没有尝试添加重复的列表。我花了非常多的时间试图弄清楚如何编写查询,但我尝试的所有事情都在运行时出现异常,我觉得我在一遍又一遍地尝试同样的事情。
我认为这个查询应该可以工作,但我不知道为什么它不工作,它构建时没有任何错误,但在运行时出现“指定的过滤条件无效”的异常:
public bool IsDuplicate(Classified classified)
{
var idSet = classified.ClassifiedTags.Select(ct => ct.Tag.Id).ToHashSet<int>();
var query = from c in _context.Classified
where c.ClassifiedTags.Select(ct => ct.Tag.Id).ToHashSet<int>().SetEquals(idSet) &&
c.User == classified.User
select c;
// .... return true if a record is found
}
这些表在 EF Core 中设置了多对多连接:Classified ClassifiedTag Tag
我的 ApplicationDbContext 看起来像这样
public DbSet<Tag> Tags { get; set; }
public DbSet<Classified> Classified { get; set; }
public DbSet<ClassifiedTag> ClassifiedTags { get; set; }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Tag>().ToTable("Tag");
builder.Entity<ClassifiedTag>().ToTable("ClassifiedTag");
builder.Entity<ClassifiedTag>()
.HasKey(ct => new { ct.ClassifiedId, ct.TagId });
builder.Entity<ClassifiedTag>()
.HasOne(c => c.Classified)
.WithMany(ct => ct.ClassifiedTags)
.HasForeignKey(ct => ct.ClassifiedId);
builder.Entity<ClassifiedTag>()
.HasOne(t => t.Tag)
.WithMany(ct => ct.ClassifiedTags)
.HasForeignKey(ct => ct.TagId);
}
我的分类模型如下所示:
public class Classified
{
public Guid Id { get; set; }
public int Type { get; set; }
public ApplicationUser User { get; set; }
public DateTime DateCreated { get; set; }
public List<ClassifiedTag> ClassifiedTags { get; set; }
}
public class ClassifiedTag {
public Guid ClassifiedId { get; set; }
public Classified Classified { get; set; }
public int TagId { get; set; }
public Tag Tag { get; set; }
}
我的 Tag 模型如下所示:
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
public List<ClassifiedTag> ClassifiedTags { get; set; }
}
我觉得这应该很简单,但在这一点上我真的被困住了,任何帮助都将不胜感激!
【问题讨论】:
-
你能用文字解释你想要达到的目标吗?你指的这个“清单”是什么?就您的实体名称而言,用户试图添加什么?
ClassifiedTag?试着告诉我这个故事:) -
对不起,我应该更清楚。用户正在尝试通过
ClassifiedTag加入表添加与Tag具有多对多关系的Classified。我正在尝试检查是否存在包含相同Tag记录集合的现有Classified。 -
所以如果
Classified有ClassifiedTag链接,那么您希望IsDuplicate返回true?那么如果Classified.User和Classified.Type存在但ClassifiedTag链接不存在,IsDuplicate是否应该返回false?
标签: c# linq asp.net-core entity-framework-core ef-core-3.0