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

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

Контекст 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; }
}

1 Ответ

1 голос
/ 06 марта 2011

Это всего лишь предположение, но сложные типы НИКОГДА не могут быть нулевыми. Поэтому, если у вас есть какая-либо ссылка на сложный тип (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-one-to-one-associations.aspx

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