一个或零到多个关系WebAPI

时间:2017-10-04 11:08:52

标签: entity-framework asp.net-web-api2

我有两个实体

主题

  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);
                }
            }
        }
     }

1 个答案:

答案 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();