Подтвердить что ты не робот

Как установить значение по умолчанию для POCO в EF CF?

В Entity Framework 4, только код (CTP3), как вы устанавливаете значение по умолчанию для свойства в классе POCO EntityConfiguration?

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
}

public class PersonConfiguration : EntityConfiguration<Person>
{
    public PersonConfiguration()
    {
        Property(p => p.Id).IsIdentity();
        Property(p => p.Name).HasMaxLength(100);

        //set default value for CreatedOn ?
    }
}
4b9b3361

Ответ 1

С выпуском Entity Framework 4.3 вы можете сделать это через Migrations.

EF 4.3 Первичное прохождение первого кода

Таким образом, используя ваш пример, это будет примерно так:

public partial class AddPersonClass : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "People",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(maxLength: 100),
                    CreatedOn = c.DateTime(nullable: false, defaultValue: DateTime.UtcNow)
                })
            .PrimaryKey(t => t.Id);
    }

    public overide void Down()
    {
        // Commands for when Migration is brought down
    }
}

Ответ 2

Вы можете установить значения по умолчанию через конструктор для класса. Вот класс, который у меня есть в моем текущем проекте, с использованием MVC3 и Entity Framework 4.1:

namespace MyProj.Models
{
using System;
using System.Collections.Generic;

public partial class Task
{
    public Task()
    {
        this.HoursEstimated = 0;
        this.HoursUsed = 0;
        this.Status = "To Start";
    }

    public int ID { get; set; }
    public string Description { get; set; }
    public int AssignedUserID { get; set; }
    public int JobID { get; set; }
    public Nullable<decimal> HoursEstimated { get; set; }
    public Nullable<decimal> HoursUsed { get; set; }
    public Nullable<System.DateTime> DateStart { get; set; }
    public Nullable<System.DateTime> DateDue { get; set; }
    public string Status { get; set; }

    public virtual Job Job { get; set; }
    public virtual User AssignedUser { get; set; }
}
}

Ответ 3

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

При создании пользователя я хочу, чтобы некоторые поля были заданы самим объектом через private setters, например. GUID и Дата создания, а не "загрязнение" конструктора.

Мой класс пользователя:

public class User
{
    public static User Create(Action<User> init)
    {
        var user = new User();
        user.Guid = Guid.NewGuid();
        user.Since = DateTime.Now;
        init(user);
        return user;
    }

    public int UserID { get; set; }

    public virtual ICollection<Role> Roles { get; set; }
    public virtual ICollection<Widget> Widgets { get; set; }

    [StringLength(50), Required]
    public string Name { get; set; }
    [EmailAddress, Required]
    public string Email { get; set; }
    [StringLength(255), Required]
    public string Password { get; set; }
    [StringLength(16), Required]
    public string Salt { get; set; }

    public DateTime Since { get; private set; }
    public Guid Guid { get; private set; }
}

Код вызова:

context.Users.Add(User.Create(c=>
{
    c.Name = "Name";
    c.Email = "[email protected]";
    c.Salt = salt;
    c.Password = "mypass";
    c.Roles = new List<Role> { adminRole, userRole };
}));

Ответ 5

Я не уверен, какая версия EF станет доступной, но с версии 5 вы наверняка справитесь с этим. Просто установите значение по умолчанию для GetDate() в столбце SQL, либо в TSQL, либо в конструктор, затем настройте свои классы EF следующим образом:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime CreatedOn { get; set; }
}

public class PersonConfiguration : EntityConfiguration<Person>
{
    public PersonConfiguration()
    {
        Property(p => p.Id).IsIdentity();
        Property(p => p.Name).HasMaxLength(100);

        this.Property(p => p.CreatedOn ).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed);
    }
}

Обратите внимание, что вам не нужно, чтобы столбец базы данных был нулевым, или свойство POCO.

Ответ 6

В случае, если SQL Server должен предоставить дату по умолчанию, как вы это сделаете, важной частью является defaultValueSql: "GETDATE()", которая установит значение по умолчанию для сервера sql, а не просто оценить время script (т.е. DateTime.UtcNow)

   public partial class AddPersonClass : DbMigration
    {
    public override void Up()
    {
        CreateTable(
            "People",
            c => new
                {
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(maxLength: 100),
                    CreatedOn = c.DateTime(nullable: false, defaultValueSql: "GETDATE()")
                })
            .PrimaryKey(t => t.Id);
    }

    public overide void Down()
    {
        // Commands for when Migration is brought down
    }
}

Ответ 7

Нет другого способа, кроме использования БД МИГРАЦИИ, а для включения миграции вы должны установить свое свойство следующим образом

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

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

  • PM> Enable-Migrations
  • PM> Add-Migration AlterMyTable Здесь AlterMyTable может быть любое имя. это создаст файл в новой папке Migrations в вашем решении currentTimestamp_AlterMyTable.cs -Накопируйте следующий метод Up из currentTimestamp_AlterMyTable.cs
  • AlterColumn("Person", "CreatedOn", n => n.DateTime(nullable: false, defaultValueSql: "SYSUTCDATETIME()")); И после этого выполните последнюю команду в консоли менеджера программ
  • PM> Update-Database И теперь, если вы видите таблицу Person в своей базе данных, а затем переходите к столбцу CreatedOn, оно должно иметь значение по умолчанию как SYSUTCDATETIME(), то есть теперь, если вы попытаетесь вставить некоторые данные в эту таблицу, ваша база данных будет автоматически обновляться этот столбец CreatedOn для вас.