2017-10-04 94 views
0

我有兩個實體一個或零一對多關係的WebAPI

主題

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

首先在這種情況下你應該沒有身份ID創建標籤種類:

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(); 
+0

InnerException = {「不能在具有唯一索引'NameIndex'的對象'dbo.Tag'中插入重複鍵行。 「} –

+0

我設置標記名爲[Index(」NameIndex「,IsUnique = true)] public String Name {get; set;} –