c# - Entity Framework - 默认值未在 sql server 表中设置

标签 c# sql-server-2005 entity-framework-4

SQL Server 2005 数据库表有一列 'createdon',其默认值设置为 getdate()。我正在尝试使用 Entity Framework 添加记录。 “createdon”列未更新。

我是否遗漏了 Entity 框架中的任何属性,请提出建议。

最佳答案

这是 Entity Framework 存在的少数几个问题之一。假设你有一个看起来像这样的类:

public class MyEntity
{
    // Id is a PK on the table with Auto-Increment
    public int Id { get; set; }

    // CreatedOn is a datetime, with a default value
    public DateTime CreatedOn { get; set; }
}

现在,您要插入一个新元素:

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity())
}

由于 EDMX 中的定义, Entity Framework 知道如何处理自增主键。它不会尝试为 Id 属性插入值。但是,就 Entity Framework 而言,CreatedOn 一个值:默认的 DateTime。因为 Entity Framework 不能说“好吧,它有一个值,但我应该忽略它”,它会主动插入具有 CreatedOn 属性值的记录,绕过表中列定义的默认值。

没有简单的方法可以做到这一点。您可以在插入该项目时主动将 CreatedOn 属性设置为 DateTime.Now。或者您可以创建接口(interface)和扩展方法对:

public interface ICreatedOn
{
    public DateTime CreatedOn { get; set; }
}

public partial class MyEntity : ICreatedOn
{

}

public static TEntity AsNew<TEntity>(this TEntity entity) where TEntity : ICreatedOn
{
    if(entity != null)
        entity.CreatedOn = DateTime.Now;

    return entity;
}

using(var context = new YourContext()) 
{
    context.MyEntities.Add(new MyEntity().AsNew())
}   

编辑: 扩展这一点,这是一个无法解决的问题的原因是因为 autoincrement 字段和带有 的字段背后的含义默认 值约束。根据定义,自动增量字段应该始终由服务器处理,使用种子和所有爵士乐。您不能为插入的自动递增字段指定值,除非您使用了SET IDENTITY INSERT ON。但是,默认值只是一个提示,表示“如果我没有指定任何值,请使用它”。因为 .NET 中的值类型不能为 null,所以总会有一个值,而 Entity Framework 无法推断那个字段的 default 值在那个时候意味着您希望它在SQL 服务器。

关于c# - Entity Framework - 默认值未在 sql server 表中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652396/

相关文章:

C# .net Web 服务 Web 方法在查看源代码中返回 < 和 >

c# - 在 EF4 中按 ID 选择通用存储库

sql-server - 如何向我的 EF4 模型添加计算列?

sql-server - 我需要在 sql server 上使用生成脚本来备份 View 和过程

java - Microsoft SQL JDBC 驱动程序 v6.2 为 DATETIME 字段返回不正确的 SQL 类型代码

entity-framework - Entity Framework CTP 5 一对一映射

c# - Visual Studio 2013 ADO.net 实体模型没有 Oracle 数据源

c# - 如何将 cloudformation 模板 yaml 反序列化为 C# 字符串字典?

c# - 从 C# 中的字典匹配正则表达式

java - 为什么 EclipseLink 将 NVARCHAR 类型映射到对象?