2015-06-19 3 views
1

Я работаю над приложением конфигуратора ПК, и у меня есть проблема с проверкой. Точка приложения, чтобы проверить, если сокет на материнской плате так же, как гнездо процессора и т.д.контекст проверки рамки сущности - null исключение в нулевом тесте

Я сделал код первой базы данных с использованием строительных лесов в Visual Studio 2013.

public class Configuration : IValidatableObject 
{ 
    [Key] 
    public int ConfigurationID { get; set; } 

    [Required] 
    [StringLength(50, MinimumLength = 3)] 
    [DisplayName("Configuration name")] 
    public string ConfigName { get; set; } 

    [ForeignKey("mb_id")] 
    public MotherBoard MotherBoard { get; set; } 

    [Column("mb_id", TypeName = "int")] 
    public Nullable<int> mb_id { get; set; } 

    [ForeignKey("cpu_id")] 
    public CPU CPU { get; set; } 

    [Column("cpu_id", TypeName = "int")] 
    public Nullable<int> cpu_id { get; set; } 
} 

Это является частью модели конфигурации, что я (остальная часть выглядит довольно похожей - только другие компоненты)

Я просто подстегнул эту модель в контроллер.

Это начало проверки, и, похоже, проблема здесь где-то (по крайней мере, говорит VS).

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (MotherBoard == null) { throw new ArgumentNullException("Motherboard"); } 
    if (CPU == null) { throw new ArgumentNullException("CPU"); } 
    if (GPU == null) { throw new ArgumentNullException("GPU"); } 
    if (HDD == null) { throw new ArgumentNullException("HDD"); } 
    if (RAM == null) { throw new ArgumentNullException("RAM"); } 
    if (Power == null) { throw new ArgumentNullException("Power"); } 
    if (Case == null) { throw new ArgumentNullException("Case"); } 

    if (MotherBoard.CPU.ToUpper().Trim() != CPU.Socket.ToUpper().Trim()) 
    { 
      yield return new ValidationResult("CPU socket does not match.", new[] { "cpu_id" }); 
    } 
} 

Когда я создаю конфигурацию ПК без проверки, он обычно идет в базу данных. Но когда я пытаюсь выполнить эту проверку, он говорит, что CPU (в null-тесте) имеет значение NULL и выбрасывает null-исключение. Screenshot from VS.

Он никогда не бросает его на материнскую плату, но всегда на следующий элемент (на второй предмет).

+0

Вы проверили опубликованное значение в CPU? Это действительно нулевое значение, или оно исключает исключение, не будучи нулевым. –

+0

На самом деле действует тихо.Когда я добавляю подтверждение в комментарий, он обычно складывает конфигурацию и помещает ее в БД. Но когда я раскомментирую это, он говорит, что и материнская плата имеет значение null, но исключает исключение из теста CPU. – healadin

+0

Я имею в виду, когда я запускаю это без проверки, он создает конфигурацию с процессором и все без проблем. – healadin

ответ

0

Процессор, как представляется, обрабатывается каркасом объекта как navigation property. Без дополнительной информации это говорит о том, что вам нужно:

  1. using System.Data.Entity в любой блок выбирает модель
  2. .Include(c => c.CPU) перед тем перечисляя запрос из базы данных

Если это действительно navigation property, как это , это может быть lazily loaded, как описано в материалах Entity Framework.

Это означает, что даже если значения, по-видимому, существуют в базе данных, фактическая коллекция - или в вашем случае, reference-- будет пустой в памяти. Таким образом, мы говорим рамки сущности «включить» те пункты, когда мы извлекаем:

var configuration = db.ConfigurationsOrSomething 
    .Include(c => c.CPU) 
    .Where(c => c.DeletedOrWhatever == false) 
    .ToList(); 

var cpu = configuration.CPU; 

if(cpu == null) 
    Debug.WriteLine("Something else is the problem. :("); 

Ты сказал, что вы видели значение в базе данных. Мы не можем видеть код, который вы использовали для выбора объекта из базы данных, или что-либо еще, если есть что-то еще. Мы также могут видеть, что CPU - это другой тип, который вы определили и указали. Ваша модель выглядит как EF Code First/Table-per-Type, если вам нужно больше узнать об этом вместе с тутари.

Примечание: Я перечитал ваши комментарии в новом свете. Когда вас спросили, попадает ли в базу данных, вы согласились, что она была «создана нормально» без проверки.

Я сейчас рассматриваю всю вашу установку как простую проверку. Если валидация говорит, что CPU имеет значение null ... тогда CPU имеет значение null.

Итак: где код, который вы используете, чтобы создать новый экземпляр этого объекта Configuration? Вы просто не присваиваете значение CPU?

+0

Можете ли вы объяснить второй шаг немного больше, пожалуйста? Я бы опубликовал весь проект, если бы мог ... – healadin

+0

спасибо, что он был очень лениво загружен – healadin

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