我有两个实体
主题
public class Subject
{
public int SubjectId { get; set; }
public virtual ICollection<Tag> Tags{ get; set; }
}
代码
public class Tag
{
public int TagId { get; set; }
public string Name { get; set; }
}
这两个实体有一个或零到多的关系。 我将两个实体之间的关系定义为
modelBuilder.Entity<Subject>().HasMany(p => p.Tags)
.WithMany().Map(x =>
{
x.MapLeftKey("SubjectId");
x.MapRightKey("TagId");
x.ToTable("Subject_Tag");
});
首先我创建了标签,但是当我编辑主题以添加标签时,数据库会创建另一个标签并链接到它,这意味着它会创建具有相同名称的重复标签。 问题是什么?
我的编辑控制器(我使用UnitOfWork存储库)
[ModelValidator]
public IHttpActionResult Put(SubjectFullDto dto)
{
try
{
SubjectExists();
var subjectEntity = ModelFactory.GetSubject(dto);
var subject = UnitOfWork.SubjectRepository.Update(subjectEntity);
var model = ModelFactory.GetLigthSubject(subject);
return Ok(model);
}
catch (Exception ex)
{
#if DEBUG
return InternalServerError(ex);
#endif
return InternalServerError();
}
}
和莫代尔工厂:
public Subject GetSubject(SubjectFullDto obj)
{
var alltags = _unitOfWork.SubjectTagRepository.Get();
var org_tags = new HashSet<int>(org_subject.Tags.Select(c => c.ID));
var new_tag = new HashSet<int>(obj.Tags.Select(c => c.Uid));
foreach (var item in alltags)
{
if (new_tag.Contains(item.ID))
{
if (!org_tags.Contains(item.ID))
{
org_subject.Tags.Add(item);
}
}
else
{
if (org_tags.Contains(item.ID))
{
org_subject.Tags.Remove(item);
}
}
}
}
答案 0 :(得分:0)
首先,在这种情况下,您应该创建没有身份标识的标记类:
public class Tag
{
[Key]
public string Name { get; set; }
}
db不要在数据库中保存重复的标签, 在您的编辑操作中:
if (model.tag!= null)
subject.tag= model.tag.Where(x => !string.IsNullOrEmpty(x)).Select(x => new tag() { Name= x }).ToList();