[c#]EF6 创建新的实体,而不是设置只是引用

发布时间: 2017/2/25 3:19:23
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想保存列表的每个事件的标志。为了完成这件事我在我的控制器使用下面的方法︰

 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:

您需要使用相同的上下文,例如︰

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();
    }
}
官方微信
官方QQ群
31647020