Первый принцип неопределенности кода EF - упомянутые объекты могут не загружаться

При автоматическом воссоздании базы данных неясно, будут ли загружены ссылаемые объекты или нет.

Контекст — EF CTP 5 и ASP.NET MVC 2. В файле global.asax задается инициализатор базы данных, который вызывает воссоздание базы данных при каждом запуске приложения.

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

Это поведение не может быть надежно воспроизведено, но наблюдалось на двух разных рабочих станциях (XP, 7) с помощью Cassini.

Ниже представлены модели. Исключение нулевой ссылки возникает при попытке доступа к свойству NewsProvider объекта NewsFeed. Снятие виртуального квалификационного турнира не имеет значения.

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

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }
}

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

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a URL")]
    [StringLength(300, ErrorMessage = "The URL is too long")]
    public string Url { get; set; }

    [Required(ErrorMessage = "Please enter a news provider")]
    public virtual NewsProvider NewsProvider { get; set; }
}

person Hans Malherbe    schedule 04.03.2011    source источник
comment
Могу я увидеть вашу модель? Сущности, которые бросают   -  person Paul    schedule 06.03.2011
comment
Это один ко многим? Если это так, я думаю, что знаю проблему и могу соответствующим образом обновить свой ответ! (У NewsProvider есть много новостных лент) Еще немного об этих отношениях, поскольку я думаю, что они потребуют небольшого изменения в вашей модели или API Fluent Mapping.   -  person Paul    schedule 06.03.2011


Ответы (1)


Это всего лишь предположение, но сложные типы НИКОГДА не могут быть нулевыми. Поэтому, если у вас есть ссылка на сложный тип (ICollection), вы должны инициализировать их из конструктора Entity.

Пример:

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

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }
}

public class NewsFeed
{
    public NewsFeed() {
        //Never allow NewsProvider to be null
        NewsProvider = new NewsProvider();
    }
    public int Id { get; set; }

    [Required(ErrorMessage = "Please enter a name")]
    [StringLength(50, ErrorMessage = "The name is too long")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a URL")]
    [StringLength(300, ErrorMessage = "The URL is too long")]
    public string Url { get; set; }

    [Required(ErrorMessage = "Please enter a news provider")]
    public virtual NewsProvider NewsProvider { get; set; }
}

Для получения дополнительной информации, вот отличный пост в блоге: http://weblogs.asp.net/manavi/archive/2010/12/11/entity-association-mapping-with-code-first-part-1-одинкодному-ассоциации.aspx

person Paul    schedule 06.03.2011
comment
Это хорошая идея, спасибо. Однако это не решает проблему, так как проблема возникает, когда вы читаете свой продукт и обнаруживаете, что свойство категории имеет значение null, даже если строка продукта имеет значение в столбце CategoryId. - person Hans Malherbe; 06.03.2011
comment
Обновлен код выше для инициализации демонстрационного конструктора с вашей моделью. - person Paul; 06.03.2011