2016-09-22 1 views
0

各イベントのフラグのリストを保存したいと思います。これを成し遂げるためには、私は私のコントローラに以下の方法を使用しています:私のApplicantRepositoryでEF6は参照を設定する代わりに新しいエンティティを作成します

public ActionResult CreateEvent(Models.Event newEvent) 
{ 
    if(!string.IsNullOrEmpty(Request.Form["flag"])) 
    { 
     string[] idArr = Request.Form["flag"].Split(','); 
     foreach(string idString in idArr) 
     { 
      int id = idString.ToInt32(); 
      newEvent.Flags.Add(_applicantRepository.GetFlagByID(id)); 
     } 
    } 
    _applicantRepository.SaveEvent(newEvent); 
} 

を私は次のメソッドを使用します。

public void SaveEvent(Event ev) 
{ 
    using (var dbCtx = new VisitorRegistrationContext()) 
    { 
     dbCtx.Events.AddOrUpdate(ev); 
     dbCtx.SaveChanges(); 
    } 
} 

public Models.Flag GetFlagByID(int id) 
{ 
    using (var dbCtx = new VisitorRegistrationContext()) 
    { 
     Models.Flag flag = dbCtx.Flags.Find(id); 
     return flag; 
    } 
} 

残念ながら、それぞれの時間は、私がイベントにいくつかの新しいを保存しますフラグが作成されます。彼らはすでに存在していても(同じIDで)。

enter image description here

これらは私のモデルです:

public class Event 
{ 
    public Event() 
    { 
     Users = new List<Usr>(); 
     Type = new EventType(); 
     Flags = new List<Flag>(); 
    } 

    public int ID { get; set; } 

    [Required] 
    [Display(Name = "Event")] 
    public string EventName { get; set; } 
    public string Comment { get; set; } 

    [Required] 
    public EventType Type { get; set; } 
    public ICollection<Flag> Flags { get; set; } 
} 

public class Flag 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public bool IsInactive { get; set; } 

    public virtual ICollection<Event> Events { get; set; } 


} 

にはどうすればFlagEventと呼ばれる私の中間テーブルで参照簡単なセットにEFを伝えることができますか?

+1

単一 'VisitorRegistrationContext'インスタンスを使用します。 – Maarten

答えて

1

次の例のように、同じコンテキストを使用する必要があります。

public void CreateEvent(Event newEvent) 
{ 
    var flags = "1,2,3"; 
    string[] idArr = flags.Split(','); 
    using (var ctx = new Context()) 
    { 
     foreach (string idString in idArr) 
      newEvent.Flags.Add(ctx.GetFlagByID(Convert.ToInt32(idString))); 
     ctx.Events.AddOrUpdate(newEvent); 
     ctx.SaveChanges(); 
    } 
} 
+0

それは動作します。ありがとうございました! – markai

関連する問題