none
Поля комплексных типов RRS feed

  • Вопрос

  • Добрый день. Подскажите пожалуйста, кто сталкивался. Есть обьявление в EF5.0 Code First

    public class Test класс таблицы
    {
      public int Id { get; set;}
      public string Name { get; set;}
      public ComplexType Value1 { get; set;}
      public ComplexType Value2 { get; set;}
      public ComplexType Value3 { get; set;}
    
    }
    
    public class ComplexType
    {
       public bool selected{ get; set;}
       public int value1{ get; set;}
       public int value2{ get; set;}
       public int value3{ get; set;}
    }

    как сделать так, чтобы ValueX в классе таблички можно было оставить NULL. Я обьявил во втором классе типы переменных с использованием ?, но это не помогает.

    public class ComplexType
    {
       public bool? selected{ get; set;}
       public int? value1{ get; set;}
       public int? value2{ get; set;}
       public int? value3{ get; set;}
    }

    И подскажите пожалуйста, как определить значения по умолчанию для полей таблицы при использовании Code First. Спасибо.

    28 августа 2012 г. 10:00

Ответы

Все ответы

  • Добрый день.

    По умолчанию, все столбцы кроме первичного ключа, будут Nullable (т.е. вы сможете записывать в них null). Чтобы сделать поле в которое нельзя поместить null, необходимо его пометить атрибутом Required. Более подробно, можете посмотреть про атрибуты вот здесь.

    Ну а значения по умолчанию, просто присваивайте в конструкторе вашего класса.

    • Предложено в качестве ответа YatajgaModerator 28 августа 2012 г. 11:15
    28 августа 2012 г. 10:16
    Отвечающий
  • Привет, если вам помогло решение, то пожалуйста, не забывайте отмечать его как ответ. Спасибо.

    Для связи [mail]

    28 августа 2012 г. 20:07
  • Спасибо за ваше внимание.

    Не получается что-то никак впихнуть данные в базу. Имею более конкретно

      public class Line
        {
            public int      Id      { get; set; }
            public String   Name    { get; set; }
            public LineType Type    { get; set; }
            public String   Description { get; set; }
    
            public virtual ICollection<LineValues> Values { get; set; }
    
            public virtual ICollection<Extruders> Extruders { get; set; } 
    
            public virtual ICollection<LineQuality> Quality { get; set; } 
        }

    далее одна из таблиц отношения

       public class LineQuality
        {
            public int      Id       { get; set; } //
            public int      LineId   { get; set; }
            public DateTime DateTime { get; set; } //
            public Quality  ParOne   { get; set; } // первый параметр качества
            public Quality  ParTwo   { get; set; } // второй параметр качества
            public Quality  ParThree { get; set; } // третий параметр качества 
            public Quality  ParFoure { get; set; } // четвертый параметр качества 
            public virtual Line Line { get; set; }
        }
    
        public class Quality
        {
            public Boolean?   Measurable { get; set; } // параметр измеряемый
            public OualParam? OualParam  { get; set; } // имя параметра
            public int?       Nominal    { get; set; } // номинал параметра
            public int?       Actual     { get; set; } // значение параметра
            public int?       Decimal    { get; set; } // десятичное смещение параметра
        }
    
        public enum OualParam:byte
        {
            Diameter = 0,    // диаметр
            Lay          // шаг скрутки
        }
    

    объявляю в классе контекста

                    var _quality = new LineQuality()
                        {
                            DateTime = new DateTime(),
                            LineId = _line.Id, // это значение из класса - списка
                            ParOne =
                                new Quality()
                                    {
                                        Actual = 123,
                                        Decimal = 2,
                                        Measurable = true,
                                        Nominal = 150,
                                        OualParam = OualParam.Diameter
                                    },
                        };

    только с одним набором параметров "качество" - вылетает с ошибкой о недопустимости вызова так как ParTwo не может быть NULL. При создании базы из модели он создал поля неНулл везде, где я явно не указал у ? поля. Если что - пинайте смело, я пока разбираюсь со всем этим и решения вероятно не идеальные. Я имею отношение таблиц 1 ко многим и хочу при работе выборочно помещать данные только в нужные мне поля нужных табличек. Соответственно НУЛЛ нужен.

    Спасибо большое.




    29 августа 2012 г. 12:38
  • Привет.

    Проблема еще актуальна? Если смотреть схему таблицы, то 100% у ParTwo стоит разрешение на Null запись?


    Для связи [mail]

    • Помечено в качестве ответа Little_Cat_2003 7 сентября 2012 г. 12:47
    5 сентября 2012 г. 11:55
  • Спасибо за ваше внимание. Прочитал тут доку и рекомендации обьявлять в конструкторе класса переменные сложных типов. Проблема ушла. Спасибо еще раз и порекомендуйте более полное описание, если возможно, способов работы и параметрирования EF Code First в целом. А то какие то части по нету валяются.

    Спасибо.

    7 сентября 2012 г. 12:47