Как установить значение по умолчанию для 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 ?
}
}
Ответы
Ответ 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 };
}));
Ответ 4
К сожалению, вы не можете. http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/a091ccd6-0ba8-4d4f-8f5e-aafabeb258e4
Ответ 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
для вас.