EF6创建新实体而不是仅设置引用

时间:2016-09-22 14:41:13

标签: c# asp.net entity-framework

我想为每个事件保存一个标志列表。为了完成这项工作,我在控制器中使用以下方法:

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

不幸的是,每次我保存一个事件时,都会创建一些新的标志。即使它们已经存在(具有相同的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; }


}

如何告诉EF简单地在我的中间表中设置名为FlagEvent的引用?

1 个答案:

答案 0 :(得分: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();
    }
}