EF4 - Добавление записи в блоге жалуется на профиль? - PullRequest
0 голосов
/ 29 мая 2009

Я должен быть администратором, это довольно забавно, хотя я думаю, что понимаю почему :) Я создал UnitTest, чтобы добавить запись в блог, чтобы попробовать предложение Алекса о моих проблемах с наследованием. Теперь я сталкиваюсь с другим.

[TestMethod]
public void UserCanAddBlogEntry()
{
    var context = new EntityContext(Options.LazyLoading);

    var user = (from u in context.Users
                    .Include("Blog.BlogEntries")
                where u.Id == 1
                select u).FirstOrDefault();

    BlogEntry entry = new BlogEntry();
    entry.Header = "Test Entry";
    entry.Text = "Test Text blah blah blah";
    entry.CreatedAt = DateTime.Now;
    entry.Blog = user.Blog;

    user.Blog.BlogEntries.Add(entry);
    context.SaveChanges();

    Assert.IsTrue(user.Blog.BlogEntries.Count > 0);
}

Вызывает исключение:

Не удалось UserCanAddBlogEntry Zirzle.UnitTests
Метод тестирования UserCanAddBlogEntry бросил исключение: System.InvalidOperationException: В приложении обнаружена неправильная связь свойство навигации «Пользователь» сущность типа «Профиль».

Не уверен, что не так с этой картинкой. Если я добавлю .Include ("Профиль") в запросе get, то сохраненные изменения больше не будут пожаловаться. Я попытался добавить 0,1 отношение конца для профиля, но это тоже не сработало. Какие-либо предложения? Полагаю, переполнение стека может дать объяснение личному эксперту EF:)

1 Ответ

1 голос
/ 29 мая 2009

Ну, это интересно.

Я предполагаю, что Blog.BlogEntries является обратной величиной BlogEntry.Blog

Я также предполагаю, что все свойства всех классов являются виртуальными, поэтому EF может прокси-классы.

С учетом этих предположений некоторые объекты будут проксироваться (user и user.Blog), потому что ObjectContext их построил, а некоторые не будут проксироваться (entry), потому что вы создали их сами.

Прокси-классы автоматически исправляются, т.е. синхронизируют оба конца отношений

Это делается на прокси-пользователе. Блог:

user.Blog.BlogEntries.Add(entry) 

автоматически установит entry.Blog на user.Blog в одно и то же время, чтобы синхронизировать обе связи.

С другой стороны, потому что entry не прокси это:

entry.Blog = user.Blog

не исправит ошибки.

Итак, в этом коде вы, по сути, дважды делаете половину исправления. Мы, вероятно, должны изящно справиться с этой ситуацией, но, очевидно, что нет, я буду обсуждать это с командой.

Сказав все это, я предлагаю вам сделать что-то немного проще:

// notice there is no need to get the User just the users blog
var blog = (from u in context.Users
           where u.Id == 1
           select u.Blog).Single();

и просто сделайте это:

BlogEntry entry = new BlogEntry();
entry.Header = "Test Entry";
entry.Text = "Test Text blah blah blah";
entry.CreatedAt = DateTime.Now;
entry.Blog = blog;
//because BlogEntry inherits from Post if I remember your model
context.Posts.Add(entry); 
context.SaveChanges();

Это должно работать.

Alex

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...