gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:43:35 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com