【问题标题】:Entity Framework, Code First, Update independent association (Collection)实体框架、代码优先、更新独立关联(集合)
【发布时间】:2015-09-03 18:33:54
【问题描述】:

为了解释这个问题,我有一个带有 Person 类的简单模型:

public class Person
{
    public int Id { get; set; }

    public virtual string Name { get; set; }
}

还有一个拥有 Person 集合的类 School:

public class School
{
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<Person> Pupils { get; set; }
}

创建学校工作正常:

using (DatabaseContext ctx = new DatabaseContext())
        {
            Person p = new Person() { Name = "Thomas" };
            Person p2 = new Person() { Name = "Markus" };
            School s = new School();
            s.Name = "Test";
            s.Pupils = new ObservableCollection<Person>();
            s.Pupils.Add(p);
            s.Pupils.Add(p2);
            ctx.Schools.Add(s);
            ctx.SaveChanges();
        }

并且在persons表中school_id外键设置正确:

Id     Name    School_Id

1      Thomas     1 
2      Markus     1  

但是当我尝试添加新瞳孔时:

using (DatabaseContext ctx = new DatabaseContext())
        {
            Person p = new Person() { Name = "Mark" };
            s.Pupils.Add(p);
            ctx.Persons.Add(p);
            ctx.SaveChanges();
        }

数据库表中 School_id 设置为空:

 Id     Name    School_Id

 1      Thomas     1 
 2      Markus     1  
 3      Mark      null  

我做错了什么?我知道我可以使用外键关联,但由于我计划将 Person Entity 与不同的相关实体一起使用,我更喜欢独立关联。

感谢您的帮助!!

【问题讨论】:

  • 听起来 s 没有附加到您应该拥有的上下文 s = ctx.Set&lt;School&gt;().Where(x =&gt; x.Id == 1).First();
  • tschmitt0​​07 非常感谢。这就是问题所在。现在它起作用了。如果你写这个作为答案,我会标记它。

标签: c# entity-framework collections ef-code-first


【解决方案1】:

听起来 s 没有附加到您应该拥有的 dbcontext

s = ctx.Set<School>().Where(x => x.Id == 1).First();

请注意 1 是一个硬编码值,你应该有一个根据应用​​程序上下文赋值的变量。

还请注意,如果 Jan 的建议不能解决您的具体问题,他的建议是好的,应该实施。

【讨论】:

    【解决方案2】:

    因为当您创建 poco 时,您的 Pupils 集合为空(即使通过 Set.Add(Set.Create()),请将您的 School poco 重写为:

    private HashSet<Person> _pupils
    
    public ICollection<Person> Pupils { 
      get {return _pupils ?? (_pupils = new HashSet<Person>());}
      set{_pupils = value;} 
    }
    

    编辑:我刚才注意到你有s.Pupils.Add(p);(但我不知道你从哪里得到s)——你真的这样使用它吗?它应该抛出空异常......或者任何机会,您的代理创建是否已禁用? (它应该被启用;))

    Edit2: s.Pupils = new ObservableCollection&lt;Person&gt;(); -- 您实际上丢弃了 EF 生成的代理集合,因此不会跟踪任何 .Add() 并且不会将更改推送到 FK 属性(您的 p.School 是 @ 987654327@)

    【讨论】:

    • 如果 Pupils 为 nul,则会抛出空指针异常。
    • 是的,我忽略了这一点...但是如果可以,请尝试一下 - 这解决了 EF 的许多问题(可能稍后会被覆盖)
    • 这没有帮助。外键仍设置为 null
    • 并扔掉s.Pupils = new ObservableCollection&lt;Person&gt;();——你真的想要EF集合(它们是代理!)----我想就是这样,你不使用proxy-ef-created集合但你的ObservableCollection,所以 FK 没有正确更新(Mark 在 SaveChanges() 之前没有任何 School 对象)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    相关资源
    最近更新 更多