Entity framework 设定EF 4.1种子时,代理的第一个导航属性为null

Entity framework 设定EF 4.1种子时,代理的第一个导航属性为null,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,当Initializer.Seed使用DbContext.DbSet.Find设置新代理的导航属性时,它会正确地将FK分配给代理,但当我中断SaveChanges并检查代理时,第一个导航属性始终为null。有人知道为什么会这样吗 抱歉,我无法发布本地人窗口的截图 模型 DbContext public class Context : DbContext { public DbSet<Thing> Things { get; set; } public DbSet<

当Initializer.Seed使用DbContext.DbSet.Find设置新代理的导航属性时,它会正确地将FK分配给代理,但当我中断SaveChanges并检查代理时,第一个导航属性始终为null。有人知道为什么会这样吗

抱歉,我无法发布本地人窗口的截图

模型

DbContext

public class Context : DbContext {
    public DbSet<Thing> Things { get; set; }
    public DbSet<Option1> Option1s { get; set; }
    public DbSet<Option2> Option2s { get; set; }
    public DbSet<Option3> Option3s { get; set; }

    public ObjectContext ObjectContext {
        get { return ((IObjectContextAdapter)this).ObjectContext; }
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
        base.OnModelCreating(modelBuilder);
    }
}
种子


哇。我不知道你在那里做了什么,但是你让对象状态跟踪器非常生气

编辑:

我相信这是调试器中的某种缺陷,以及它与动态代理的工作方式。我这样说是因为您可以执行Console.WriteLinething.Option1.Id;它将为您提供正确的id。如果您通过说var thing=newthing;,来摆脱动态代理;,调试器问题消失了

下面是一个更标准的方法来做你想做的事情

    var option1s = new List<Option1> {
            new Option1{Name="Red"},
            new Option1{Name="Green"}};
    option1s.ForEach(x => db.Option1s.Add(x));

    var option2s = new List<Option2> {
            new Option2{Name = "Tall"},
            new Option2{Name = "Short"}};
    option2s.ForEach(x => db.Option2s.Add(x));

    var option3s = new List<Option3> {
            new Option3{Name = "Male"},
            new Option3{Name = "Female"}};
    option3s.ForEach(x => db.Option3s.Add(x));

    var thing = db.Things.Create();
    thing.Option1 = option1s[0];
    thing.Option2 = option2s[0];
    thing.Option3 = option3s[0];

    db.Things.Add(thing);
    db.SaveChanges();

我认为这是一个错误。我在下面添加了一个编辑。感谢您的关注。我在调用Create之后立即调用了db.Things.Addthing,问题就解决了。尽管如此,正如您所指出的,尽管调试混乱,它仍然可以工作。当_changeTracker为null时,它似乎对第一个属性做了一些奇怪的事情。我还向上下文中添加了一个方法,该方法创建并添加了一个新的代理,以便将来不会忘记设置EntityState。你怎么认为?一开始没有添加实体是我的错吗?或者它应该像我那样处理新创建的实体吗?
var option1s = new List<Option1> {
    new Option1{Name="Red"},
    new Option1{Name="Green"}};
    option1s.ForEach(x => db.Option1s.Add(x));
    db.SaveChanges();
var option2s = new List<Option2> {
    new Option2{Name = "Tall"},
    new Option2{Name = "Short"}};
    option2s.ForEach(x => db.Option2s.Add(x));
    db.SaveChanges();
var option3s = new List<Option3> {
    new Option3{Name = "Male"},
    new Option3{Name = "Female"}};
    option3s.ForEach(x => db.Option3s.Add(x));
    db.SaveChanges();

var thing = db.Things.Create();
    thing.Option1 = db.Option1s.Find(1); //the first thing.XXXX shows null no matter what order
    thing.Option2 = db.Option2s.Find(1); //but the FK's work for all three of them
    thing.Option3 = db.Option3s.Find(1);
db.Things.Add(thing);
db.SaveChanges();
    var option1s = new List<Option1> {
            new Option1{Name="Red"},
            new Option1{Name="Green"}};
    option1s.ForEach(x => db.Option1s.Add(x));

    var option2s = new List<Option2> {
            new Option2{Name = "Tall"},
            new Option2{Name = "Short"}};
    option2s.ForEach(x => db.Option2s.Add(x));

    var option3s = new List<Option3> {
            new Option3{Name = "Male"},
            new Option3{Name = "Female"}};
    option3s.ForEach(x => db.Option3s.Add(x));

    var thing = db.Things.Create();
    thing.Option1 = option1s[0];
    thing.Option2 = option2s[0];
    thing.Option3 = option3s[0];

    db.Things.Add(thing);
    db.SaveChanges();