2014-11-20 2 views
7

Я пытаюсь использовать Code-First EF6 со значениями по умолчанию SQL.Значение столбца по умолчанию SQL с Entity Framework

К примеру, у меня есть столбец «CreatedDate»/свойство не нулевое значение по умолчанию в SQL из «GETDATE()»

Как представить это в моем коде модели? В настоящее время у меня есть:

<DatabaseGenerated(DatabaseGeneratedOption.Computed)> 
Public Property CreatedDate As DateTime 
Будет ли

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

<DatabaseGenerated(DatabaseGeneratedOption.Computed)> 
Public Property CreatedDate As DateTime? 

Или есть лучшее решение там?

Я не хочу, чтобы EF обрабатывал мои значения по умолчанию - я знаю, что это доступно мне, но это невозможно в моей текущей ситуации.

ответ

12

В настоящее время в EF6 нет атрибута для определения функций базы данных, используемых для определенного значения по умолчанию для свойства. Вы можете проголосовать на Codeplex, чтобы получить его реализовать:

https://entityframework.codeplex.com/workitem/44

Принятая способ реализовать что-то подобное, чтобы использовать Computed свойства с Migrations, где вы указываете функцию базы данных по умолчанию.

Ваш класс может выглядеть в C#:

public class MyEntity 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
    public DateTime Created { get; set; } 
} 

Вычисленное свойство не должно быть обнуляемым.

Затем вы должны выполнить миграцию и вручную изменить ее, чтобы включить функцию SQL по умолчанию. Миграция может выглядеть так:

public partial class Initial : DbMigration 
{ 
    public override void Up() 
    { 
     CreateTable(
      "dbo.MyEntities", 
      c => new 
       { 
        Id = c.Int(nullable: false, identity: true), 
        Name = c.String(), 
        Created = c.DateTime(nullable: false, defaultValueSql: "GetDate()"), 
       }) 
      .PrimaryKey(t => t.Id); 

    } 

    public override void Down() 
    { 
     DropTable("dbo.MyEntities"); 
    } 
} 

Вы заметите функцию defaultValueSql. Это ключ к получению вычислений

+0

Отлично, спасибо, я поеду с этим пока. – Carl

+0

Добро пожаловать;) –

2

Ответ принят правильно, просто обновляя решение EF Core; (также мое решение сосредоточено на изменении значения по умолчанию, а не на правильном его создании в первый раз)

По-прежнему нет атрибута данных.

И вы все равно должны использовать Fluent API; у него есть HasDefaultValue

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Blog>() 
     .Property(b => b.Rating) 
     .HasDefaultValue(3); 
} 

Note, есть также HasDefaultValueSql для случая NULL:

 .HasDefaultValueSql("NULL"); 

И вы также можете использовать Миграции Up и Down методы, вы можете изменить defaultValue или defaultValueSql, но вы может потребоваться сначала отбросить индексы. Вот пример:

public partial class RemovingDefaultToZeroPlantIdManualChange : Migration 
{ 
    protected override void Up(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME" 
     ); 

     migrationBuilder.AlterColumn<int>(
      name: "COLUMN_NAME", 
      table: "TABLE_NAME", 
      nullable: true, 
      //note here, in the Up method, I'm specifying a new defaultValue: 
      defaultValueSql: "NULL", 
      oldClrType: typeof(int)); 

     migrationBuilder.CreateIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME", 
      column: "COLUMN_NAME" 
     ); 
    } 

    protected override void Down(MigrationBuilder migrationBuilder) 
    { 
     migrationBuilder.DropIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME" 
     ); 

     migrationBuilder.AlterColumn<int>(
      name: "COLUMN_NAME", 
      table: "TABLE_NAME", 
      nullable: true, 
      //note here, in the Down method, I'll restore to the old defaultValue: 
      defaultValueSql: "0", 
      oldClrType: typeof(int)); 

     migrationBuilder.CreateIndex(
      name: "IX_TABLE_NAME_COLUMN_NAME", 
      table: "TABLE_NAME", 
      column: "COLUMN_NAME" 
     ); 


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