Как установить значение по умолчанию для POCO в EF CF?
В интерфейсе Entity Framework Code First, как вы устанавливаете значение по умолчанию для свойства в classе EntityConfiguration POCO?
public class Person { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedOn { get; set; } } public class PersonConfiguration : EntityConfiguration { public PersonConfiguration() { Property(p => p.Id).IsIdentity(); Property(p => p.Name).HasMaxLength(100); //set default value for CreatedOn ? } }
- свойство навигации должно быть виртуальным - не требуется в ef core?
- Использование MySQL с платформой Entity Framework
- Entity Framework: запрос дочерних объектов
- Entity Framework v2 не поддерживает sql 2000?
- Как просмотреть SQL, созданный платформой Entity Framework?
- Создание поля First Date Framework
- SqlException из Entity Framework - новая транзакция не допускается, поскольку в сеансе есть другие streamи
- Установите десятичное значение (16, 3) для столбца в первом подходе кода в EF4.3
- Отображение представлений базы данных в EF 5.0 Code First w / Migrations
- Рамификации DbSet.Create против нового объекта ()
- Entity Framework 4 выборочно ленивые свойства загрузки
- Entity framework 4.3 запускает миграцию при запуске приложения
- Как я могу запросить нулевые значения в структуре сущностей?
С выпуском 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 } }
Вы можете установить значения по умолчанию через конструктор для classа. Вот class, который у меня есть в моем текущем проекте, используя 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 HoursEstimated { get; set; } public Nullable HoursUsed { get; set; } public Nullable DateStart { get; set; } public Nullable DateDue { get; set; } public string Status { get; set; } public virtual Job Job { get; set; } public virtual User AssignedUser { get; set; } } }
Я знаю, что эта тема продолжается некоторое время, и я вошел в ту или иную проблему. До сих пор я не мог найти решение для меня, которое держит все вместе в одном месте, поэтому код все еще доступен для чтения.
При создании пользователя я хочу, чтобы некоторые поля устанавливались самим объектом через private setters
, например GUID и Дата создания, а не «загрязняли» конструктор.
Мой class пользователя:
public class User { public static User Create(Action 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 Roles { get; set; } public virtual ICollection 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 { adminRole, userRole }; }));
К сожалению, вы не можете. http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/a091ccd6-0ba8-4d4f-8f5e-aafabeb258e4
Я не уверен, какая версия EF станет доступной, но с версии 5 вы наверняка справитесь с этим. Просто установите значение GetDate () по умолчанию в столбце SQL, либо в TSQL, либо в конструктор, а затем настройте classы EF следующим образом:
public class Person { public int Id { get; set; } public string Name { get; set; } public DateTime CreatedOn { get; set; } } public class PersonConfiguration : EntityConfiguration { 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.
В случае, если SQL Server должен предоставить дату по умолчанию, как вы это сделаете, важной частью является defaultValueSql: «GETDATE ()», которая установит значение по умолчанию для SQL Server, а не просто оценит время выполнения сценария (например, 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 } }
Нет другого способа, кроме использования БД-МИГРАЦИЙ, и для включения миграций вы должны установить свое свойство следующим образом
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreatedOn { get; set; }
И после этого, как только ваша firebase database будет создана, вы должны выполнить следующие шаги, чтобы включить миграцию. Перейдите в консоль диспетчера программ и выполните следующие команды по одной команде
-
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()"));
И после этого выполните последнюю команду в консоли программы Manager -
PM> Update-Database
Теперь, если вы видите таблицуPerson
в своей базе данных, а затем перейдите к столбцуCreatedOn
она должна иметь значение по умолчанию какSYSUTCDATETIME()
то есть теперь, если вы попытаетесь вставить некоторые данные в эту таблицу, ваша firebase database будет автоматически обновите этот столбецCreatedOn
для вас.