【问题标题】:Adding a sub collection of new object and my new object into the database with Entity framework使用实体框架将新对象和我的新对象的子集合添加到数据库中
【发布时间】:2015-07-08 01:54:39
【问题描述】:

方法真的很简单,看不出我遗漏了什么……

 public int SaveEvent(Data.Models.Event evnt)
    {
        db.Events.Add(evnt);
        db.SaveChanges();

        return evnt.EventId;
    }

这是对象声明:

   public class Event
    {
        public int EventId { get; set; }
        public string Name { get; set; }
        public ICollection<EventTag> EventTags { get; set; }
    }

evnt 对象包含一个属性名称 EventTags,其中包含 6 个新元素。 evnt 被插入到数据库中,但不是EventTag... 知道吗?没有错误没有。只是 EventTag 没有添加...

public class EventDbContext : DbContext
{
    public DbSet<Event> Events { get; set; }

    public DbSet<EventTag> EventTags { get; set; }
    public DbSet<Tag> Tags { get; set; }

}

这是该值的屏幕截图:

【问题讨论】:

    标签: entity-framework entity-framework-core


    【解决方案1】:

    如果没有将 EventTag 添加到数据库中,您可能需要手动指定每个标签的 EntityState。

    public int SaveEvent(Data.Models.Event evnt)
    {
    
        foreach(var tag in evnt.EventTags) 
        {
           db.Entry(tag).State = EntityState.Added; 
        }
    
        db.Events.Add(evnt);
        db.SaveChanges();
        return evnt.EventId;
    }
    

    您可能还想更新您的类定义并将 EventTags 属性设置为virtual

     public class Event
     {
         public int EventId { get; set; }
         public string Name { get; set; }
         public virtual ICollection<EventTag> EventTags { get; set; }
     }
    

    在您的屏幕截图中,标签似乎正在加载,但标签上的 Location 属性却没有。如果是这种情况,请确保也将 Location 属性设置为 virtual

    【讨论】:

    • 其实我读到的 virtual 是用于延迟加载的,但我不想延迟加载那些。我可能错了
    • 手动输入确实有效,但我不明白为什么?没有它可以做到吗?我在设置之前检查了标签的状态,它是“未知的”。
    • 如果您不想使用延迟加载,那么您可以手动加载记录。这是一个很好的MSDN article,涵盖了这个过程。话虽如此,延迟加载并不总是一件坏事。在决定反对之前,您可能会进行一些基准测试以确保您的性能确实受到影响。
    • 不幸的是,让实体框架识别子对象的状态有时需要使用 db.Entry() 方法。
    • 仅供参考,这是我们试图在 EF7 中改进的内容。请参阅我们的design meeting notes
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多