Первое свойство навигации прокси-сервера равно нулю при заполнении EF 4.1 - PullRequest
1 голос
/ 22 июля 2011

Когда Initializer.Seed() использует DbContext.DbSet.Find() для установки свойств навигации для нового Прокси, он правильно назначает FK для Прокси, но свойство навигации first всегда пустое, когда я включаю SaveChanges() и проверить прокси.Кто-нибудь знает, почему это происходит?

(Извините, я не могу опубликовать скриншот окна местных жителей.)

Модель

public class Thing : Base {
    public virtual Nullable<int> Option1ID { get; set; }
    public virtual Option1 Option1 { get; set; }
    public virtual Nullable<int> Option2ID { get; set; }
    public virtual Option2 Option2 { get; set; }
    public virtual Nullable<int> Option3ID { get; set; }
    public virtual Option3 Option3 { get; set; }
}
public class Option1 : Base {
    public virtual ICollection<Thing> Things { get; set; }
}
public class Option2 : Base {
    public virtual ICollection<Thing> Things { get; set; }
}
public class Option3 : Base {
    public virtual ICollection<Thing> Things { get; set; }
}
public class Base {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

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

Семя ()

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();

1 Ответ

0 голосов
/ 23 июля 2011

Ничего себе.Я не знаю, что вы там делали, но вы очень разозлили трекер состояния объекта.

РЕДАКТИРОВАТЬ:

Я считаю, что это какая-то ошибка вотладчик и способ его работы с динамическими прокси.Я говорю это, потому что вы можете сделать Console.WriteLine(thing.Option1.Id);, и это даст вам правильный идентификатор.Если вы избавитесь от динамического прокси, сказав var thing = new Thing();, проблема отладчика исчезнет.

Вот более стандартный способ сделать то, что вы пытаетесь сделать.

    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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...