2012-01-12 5 views
0

Я думаю, что я столкнулся с ошибкой, кажется, что EF не обрабатывает ссылки после удаления и повторного вставки объекта. Я сумел воспроизвести его на код ниже (принимает на себя все утверждает, проходят, кроме того, я говорю в комментариях):

Ссылка остается пустой

var database = new TestEntities(); 

// select and delete the info record 
var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 
// when i uncomment the line below the last Assert fails 
// Assert.IsNotNull(info.Member); 
database.Info.Remove(info); 

// add it again and persist it to the database 
database.Info.Add(new Info { 
    ID = 1, 
    MemberID = 1 
}); 
database.SaveChanges(); 

// should not be null ? EDIT: i guess i understand this becoming null 
Assert.IsNull(info.Member); 

// and even here its still null 
info = database.Info.First(i => i.ID == 1); 
Assert.IsNull(info.Member); 


Может кто-нибудь сказать мне, что происходит здесь?

EDIT: Мои сущности генерируются с использованием базы данных сначала и im, используя генератор DbContext/POCO.

public partial class Member 
{ 
    public Member() 
    { 
     this.Info = new HashSet<Info>(); 
    } 

    public int ID { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Info> Info { get; set; } 
} 

public partial class Info 
{ 
    public int ID { get; set; } 
    public int MemberID { get; set; } 

    public virtual Member Member { get; set; } 
} 
+0

Попробуйте превратить ленивую загрузку. – cadrell0

+0

Как определяются ваши сущности? Код сначала? Создано из базы данных? –

+0

@ cadrell0 - Я боюсь, что это не вариант, так как мне нужна ленивая загрузка. – Fabian

ответ

1

Оказалось, что это не имеет никакого отношения к удалению и повторному вставке, на самом деле это не так. Это было было так очевидно ...

я вставлял с использованием ПОКО, который не охотно загружен и не имеет каких-либо ленивые возможности загрузки ...

Второй раз я запросила же записи я ожидал прокси, но кажется, что POCO был кэширован EF, и это то, что оно вернуло, означает, что все еще нет нетерпеливой или ленивой загрузки.

Я могу исправить это, убедившись, что EF не извлекает второй запрос из кеша, вставляя его с помощью прокси-сервера (var info = database.Info.Create()) или включающего члена в запрос (database.Info.Include(i => i.Member).First(i => i == 1)).

0

Учитывая это

var info = database.Info.First(i => i.ID == 1); 
Assert.AreEqual(1, info.MemberID); 

Вы не сравнивая info.ID с info.MemberID здесь? Разве не возможно, что ID и MemberID на самом деле разные?

Кроме того, не следует ли вы использовать .SaveChanges() после того, как

database.Info.Remove(info); 

?

Кроме того, информация не имеет .member, если ни одна из них не была создана. Есть ли коррелирующий член с MemberID равным info.MemberId?

+0

Я понимаю путаницу, у члена также есть ID 1 (и да, член существует в базе данных). О '.SaveChanges()' после '.Remove()', к сожалению, не имеет никакого значения. – Fabian

Смежные вопросы