相关疑难解决方法(0)

Entity Framework迁移中必填字段的默认值?

我已经将[Required]数据注释添加到ASP.NET MVC应用程序中的一个模型中.创建迁移后,运行该Update-Database命令会导致以下错误:

无法将值NULL插入列'Director',表'MOVIES_cf7bad808fa94f89afa2e5dae1161e78.dbo.Movies'; 列不允许空值.更新失败.该语句已终止.

这是因为某些记录的Director列中包含NULL .如何自动将这些值更改为默认值(例如"John Doe")导演?

这是我的模型:

  public class Movie
    {
        public int ID { get; set; }
        [Required]
        public string Title { get; set; }

        [DataType(DataType.Date)]
        public DateTime ReleaseDate { get; set; }

        [Required]
        public string Genre { get; set; }

        [Range(1,100)]
        [DataType(DataType.Currency)]
        public decimal Price { get; set; }

        [StringLength(5)]
        public string Rating { get; set; }

        [Required]     /// <--- NEW
        public string Director { get; set; }
    } …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework ef-code-first

87
推荐指数
5
解决办法
7万
查看次数

实体框架6:如何覆盖SQL生成器?

我想在生成数据库模式(DDL)时修改由EF:CF生成的SQL,如实体框架团队建议的那样.

如何才能做到这一点?

我无法通过Google找到合适的内容.

entity-framework sql-generation ef-code-first ef-migrations entity-framework-6

11
推荐指数
1
解决办法
4912
查看次数

EF 4.3.1迁移异常 - AlterColumn defaultValueSql为不同的表创建相同的默认约束名称

我有一个使用OOB数据库初始化程序创建的数据库,我使用的是Code First和EF 4.3.1.

我想利用Add-Migration cmdlet上的新"IgnoreChanges"标志,以便我可以更改一些列并添加默认SQL值.本质上,我的一些实体有一个名为DateLastUpdated的列,我想将DEFAULT设置为sql表达式GETDATE().

我使用"add-migration InitialMigration -ignorechanges"创建了InitialMigration,然后我将以下内容添加到Up()和Down():

public override void Up()
{
    AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
    AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
    AlterColumn("Chains", "DateLastUpdated", c => c.DateTime(defaultValueSql: "GETDATE()"));
}

public override void Down()
{
    AlterColumn("CustomerLocations", "DateLastUpdated", c => c.DateTime());
    AlterColumn("UserReportTemplates", "DateLastUpdated", c => c.DateTime());
    AlterColumn("Chains", "DateLastUpdated", c => c.DateTime());
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试运行"Update-Database -verbose",但我发现它正在尝试在数据库上创建相同的命名默认约束,并且SQL抛出异常:

Applying explicit migrations: [201203221856095_InitialMigration].
Applying explicit migration: 201203221856095_InitialMigration.
ALTER TABLE [CustomerLocations] ADD CONSTRAINT DF_DateLastUpdated DEFAULT GETDATE() FOR [DateLastUpdated]
ALTER TABLE [CustomerLocations] ALTER COLUMN [DateLastUpdated] [datetime] …
Run Code Online (Sandbox Code Playgroud)

.net entity-framework ef-migrations entity-framework-4.3

5
推荐指数
2
解决办法
7026
查看次数

Entity Framework 6 Code first 覆盖 MigrationCodeGenerator 的默认值

我发现的所有关于声明默认值的方法都是在 Sql 脚本中生成默认值,而不是在迁移代码中。

我最喜欢的是使用属性:https : //stackoverflow.com/a/34894274/132942

[SqlDefaultValue(DefaultValue = "getutcdate()")]
public DateTime CreatedDateUtc { get; set; }
Run Code Online (Sandbox Code Playgroud)

属性定义

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SqlDefaultValueAttribute : Attribute
{
    public string DefaultValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在上下文的“OnModelCreating”中添加

modelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
Run Code Online (Sandbox Code Playgroud)

然后自定义SqlGenerator。但我不喜欢这样,因为我不知道在生成迁移时是否一切都如我所愿。

为此,我像这样修改了MigrationCodeGeneratorhttps : //stackoverflow.com/a/21024108

在自定义 MigrationCodeGenerator

public class ExtendedMigrationCodeGenerator : MigrationCodeGenerator
{
    public override ScaffoldedMigration Generate(string migrationId, IEnumerable<MigrationOperation> operations, string sourceModel, string targetModel, string @namespace, string className)
    {
        foreach (MigrationOperation …
Run Code Online (Sandbox Code Playgroud)

entity-framework default-value ef-code-first entity-framework-6 entity-framework-migrations

5
推荐指数
1
解决办法
464
查看次数

ef6中的自动CreatedAt和UpdatedAt字段OnModelCreating()

我的模型中有列CreatedAtUpdatedAtUser.

User.cs

public string Name { get; set; }
public DateTime? CreatedAt { get; set; }
public DateTime? UpdatedAt { get; set; }
Run Code Online (Sandbox Code Playgroud)

需求

  • 当我们SaveChanges()的用户记录,CreatedAtUpdatedAt应自动保存如:DateTime.UtcNow
  • 当我更新User记录时,只有UpdatedAt列应该更新到当前日期时间.
  • 这应该自动发生在所有其他模型上,可能是一些配置OnModelCreating().
  • 我希望这种行为能够latest从数据库和其他地方查找记录.
  • 我正在使用code first迁移方法
  • 我正在使用MySQL服务器MySql.Data,MySql.Data.Entity.EF6.

UPDATE

我添加了BaseEntity.cs模型

public abstract class BaseEntity
    {
        public DateTime CreatedAt { get; set; }
        public DateTime UpdatedAt { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-6 asp.net-mvc-5

3
推荐指数
1
解决办法
2513
查看次数