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/