2016-09-22 1 views
0

Я хотел бы сохранить список флагов для каждого события. Для того, чтобы получить это сделано, я использую следующий метод в моем контроллере: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); 
} 

В моем ApplicantRepository я использую следующие методы:

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

К сожалению, каждый раз, когда я сохраню это событие какое-то новое будут созданы флаги. Хотя они уже существуют (с одним и тем же идентификатором).

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


} 

Как я могу сказать, EF к простому набору ссылки в моей промежуточной таблице под названием Flagevent?

+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