Почему мой столбец значений по умолчанию автоматически заполняется датой 1 января 0001 года? - PullRequest
2 голосов
/ 07 марта 2011

Таблица определений

enter image description here

Определение модели

enter image description here

код

using MyRandomizer.Models;

namespace MyRandomizer
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Database1Entities db = new Database1Entities())
            {

                Category c = new Category();
                c.Name = "Integral";

                db.Categories.AddObject(c);
                db.SaveChanges();

            }
        }
    }
}

выход

enter image description here

Вопрос

Почему мой столбец значений по умолчанию автоматически заполняется датой 1 января 0001 года?

Ответы [ 2 ]

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

Если вы установили StoreGeneratedPattern="Computed" в конструкторе, он включается только в концептуальную модель (CSDL).Но вам также нужно это в модели хранения (SSDL).Если вы этого не сделаете, EF сгенерирует инструкцию INSERT, которая будет содержать текущее значение даты, равное DataTime.MinValue.Модель хранилища не может быть отредактирована из конструктора.Вы должны открыть файл EDMX в формате XML и вручную обновить определение строки.

Окончательное определение должно выглядеть следующим образом:

<edmx:Edmx ...>
  <edmx:Runtime>
    <edmx:StorageModels> 
      <Schema ...>
        <EntityContainer Name="...">
          <EntitySet Name="Categories" EntityType="...Categories" store:Type="Tables" Schema="dbo" />
          ...
        </EntityContainer>
        <EntityType Name="Categories"/>
          ...
          <!-- Here you must add StoreGeneratedPattern -->
          <Property Name="CreationDate" Type="datetime" Nullable="false" StoreGeneratedPattern="Computed" /> 
        </EntityType>
      </Schema>
    </edmx:StorageModels>
    ...
  </edmx:Runtime>
</edmx:Edmx>

Но у этого решения есть одна большая проблема.После того, как вы вручную измените часть SSDL, вы не должны использовать «Обновление из базы данных», иначе вам придется выполнять это изменение после каждого вызова «Обновление из базы данных».Причина в том, что «Обновление из базы данных» удаляет текущую часть SSDL EDMX и создает новую на основе текущей структуры БД.

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

Посмотрите на картинку Определение модели .Значение по умолчанию не указано.Ваш объект базы данных не знает, что значение по умолчанию.Таким образом, он использует текущее значение CreationDate.Попробуйте установить значение по умолчанию для определения вашей модели на что-то разумное.

...