创建实体框架模型

时间:2016-10-28 17:54:43

标签: c# sql-server entity-framework entity-framework-6 ef-database-first

假设我的数据库中有以下表格:

CREATE TABLE [dbo].[Test]
(
    [Id]      INT            IDENTITY (1, 1) NOT NULL,
    [Active]  BIT            DEFAULT ((1)) NOT NULL,
)

从此数据库创建EF模型时,Active 位列的映射(映射到Boolean列)没有默认值(请参阅属性“默认值): Property View - Model Diagram

为什么实体框架的行为方式如此?为什么在创建模型时,数据库中定义的默认值不会自动应用于模型中?数据库指出默认值应为1,我假设它是模型中的默认值true。我是否真的必须再次为模型中的所有列设置默认值?

我检查了 int 列的此行为。

我做了一些调查,并试图手动将“默认值”属性设置为Truetrue,两者都有效。

Manually changed default value

Test-entity的自动生成构造函数从

更改
public Test()
{
}

public Test()
{
    this.Active = true;
}

因此,在EF中可以使用默认值,但是在基于数据库优先生成模型时不会设置它们,至少不在我的机器上。

所以,问题仍然存在:我是否真的必须再次为模型中的所有列设置默认值,即使它们已经在数据库中设置了?

2 个答案:

答案 0 :(得分:2)

试试这个:

StoreGeneratedPattern = Calculated

编辑:

对于单一代码行答案感到抱歉,但最后一天我真的很匆忙。

要使EF设置属性的db默认值,最快的方法是打开.edmx设计器,单击感兴趣的字段并设置

StoreGeneratedPattern =已计算

在其属性中(您可以在第二个屏幕截图中看到此属性,将“默认值”设置为true)。

答案 1 :(得分:0)

此解决方案可解决具有相同属性的所有实体,例如 CreatedDateTime

public partial class MyEntities : ObjectContext
    {
        public override int SaveChanges(SaveOptions options)
        {
            this.DetectChanges();

            foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added))
            {
                if (insert.Entity.GetType().GetProperty("CreatedDateTime") != null && insert.Entity.GetType().GetProperty("CreatedDateTime").GetType().Name == "DateTime" && (DateTime)(insert.Entity.GetType().GetProperty("CreatedDateTime").GetValue(insert.Entity)) == DateTime.Parse("0001-01-01 00:00:00.0000000"))
                    insert.Entity.GetType().GetProperty("CreatedDateTime").SetValue(insert.Entity, DateTime.UtcNow, null);                
            }
            return base.SaveChanges(options);
        }
    }

引用:https://stackoverflow.com/a/5965743/7731479