EF 4.1 - Как добавить значение по умолчанию для вставки для столбца даты и времени - PullRequest
4 голосов
/ 04 июня 2011

Используя EF 4.1, как я могу добавить значение по умолчанию к базовой таблице? В этом конкретном случае, как я могу установить для столбца datetime эквивалент getdate каждый раз, когда я вставляю новую запись в базу данных, не устанавливая ее в коде.

Заранее спасибо

Ответы [ 6 ]

7 голосов
/ 04 июня 2011

Решение, предложенное @elkdanger, - это верное решение, но если вы используете подход, основанный на коде, вам не нужно создавать частичный класс - вы можете поместить инициализацию непосредственно в вашу сущность.

Неиспользовать подход базы данных!Это не будет работать, поскольку потребует пометки свойства как сгенерированной базы данных (для правильного заполнения после вставки).После того, как вы отметите созданную базу данных свойств, вы никогда не сможете изменить ее значение в приложении.

Последний параметр переопределяет SaveChanges в производном DbContext и устанавливает свойство вручную.Что-то вроде:

public override int SaveChanges()
{
    var entities = ChangeTracker.Entries<YourEntityType>()
                                .Where(e => e.State == EntityState.Added)
                                .Select(e => e.Entity);
    var currentDate = DateTime.Now;
    foreach(var entity in entities)
    {
        entity.Date = currentDate;
    }

    return base.SaveChanges();
}

Этот подход может быть лучше, если может быть существенная разница между созданием экземпляра сущности и сохранением экземпляра.

2 голосов
/ 04 июня 2011

Вы можете создать частичный класс для вашей сущности, а внутри конструктора установить для столбца даты значение DateTime.Now.Таким образом, каждый раз, когда вы создаете экземпляр своего класса, в этом поле будет автоматически установлена ​​текущая дата.

0 голосов
/ 22 июля 2013

Использовать [DatabaseGenerated (DatabaseGeneratedOption.Computed)] из System.ComponentModel.DataAnnotations.Schema;

, если в базе данных настроены значения по умолчанию.

0 голосов
/ 14 августа 2012

Вы также можете изменить свой шаблон T4 (файл .tt), чтобы добавить частичный метод, который вы вызываете из сгенерированного конструктора.Затем вы можете создать свой собственный частичный класс, реализовать частичный метод и установить значение по умолчанию.

Фрагмент из шаблона T4, в котором создается конструктор, за которым следует частичный метод.Обратите внимание на последние три строки:

public <#=code.Escape(entity)#>()
{
<#
    foreach (var edmProperty in propertiesWithDefaultValues)
    {
#>
    this.<#=code.Escape(edmProperty)#> = =code.CreateLiteral(edmProperty.DefaultValue)#>;
<#
    }

    foreach (var navigationProperty in collectionNavigationProperties)
    {
#>
    this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=code.Escape(navigationProperty.ToEndMember.GetEntityType())#>>();
<#
    }

    foreach (var complexProperty in complexProperties)
    {
#>
    this.<#=code.Escape(complexProperty)#> = new <#=code.Escape(complexProperty.TypeUsage)#>();
<#
    }
#>

    SetDefaultValues();
}

partial void SetDefaultValues();

Это приведет к тому, что сгенерированная сущность будет иметь что-то вроде:

public Foo()
{
    // Properties set based on defaults in edmx

    SetDefaultValues();
}

partial void SetDefaultValues();

Затем в вашем частичном классе вы можете просто добавить что-то вроде:

partial void SetDefaultValues()
{
    this.SomeDate = DateTime.Today;
}
0 голосов
/ 04 июня 2011

Сам Entity Framework не имеет механизма для этого.Вы должны сделать это вручную в БД или коде.

0 голосов
/ 04 июня 2011

Вы можете (и, возможно, должны) сделать это в самой таблице, используя триггер или значение по умолчанию.

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