在 Code-First Entity Framework 和 SQL Server 中使用 DateTime 属性

发布于 2024-12-14 02:40:10 字数 858 浏览 0 评论 0原文

我有一个示例类 book

public class Book
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
}

当我尝试将新的 book 添加到 BookDb 上下文时......

using (BookDb db = new BookDb())
{
    Book book = new Book {
        Name = "Some name",
        DateAdded = DateTime.Now
    };

    db.Books.Add(book);
    db.SaveChanges();
}

... 抛出错误:

System.Data.SqlClient.SqlException:datetime2数据的转换 类型转换为日期时间数据类型导致值超出范围。这 声明已终止。


我发现造成此问题的原因是 .NET 和 SQL Server 之间的 datetime 类型不兼容。有一种方法可以告诉 EF 在传统实体框架中使用 SQL Server 格式,但是如何在代码优先实体框架中执行此操作?

我在 . NET 4(MVC 3 Web 应用程序)和 SQL Server 2008 Express。

I have an example class book:

public class Book
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime DateAdded { get; set; }
}

When I attempt to add a new book to the BookDb context...

using (BookDb db = new BookDb())
{
    Book book = new Book {
        Name = "Some name",
        DateAdded = DateTime.Now
    };

    db.Books.Add(book);
    db.SaveChanges();
}

... an error is thrown:

System.Data.SqlClient.SqlException: The conversion of a datetime2 data
type to a datetime data type resulted in an out-of-range value. The
statement has been terminated.


I've found that the cause of this is the incompatible datetime types between .NET and SQL Server. There is a way to tell EF to use SQL Server's format in traditional Entity Framework, but how do I do it in Code-First Entity Framework?

I am using EF4 on .NET 4 (MVC 3 web app) and SQL Server 2008 Express.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

北方的巷 2024-12-21 02:40:10

您可以在 Fluent API 中指定类型:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2");

这会在数据库中创建一个 datetime2(7) 列。如果您想微调精度,可以使用:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2")
    .HasPrecision(0);

... 对于数据库中的 datetime2(0) 列。

但是,您在问题中显示的代码是有效的,因为 datetime 类型允许存储早至 1750 年左右的日期。该异常仅发生在更早的日期。此异常的一个常见原因是未初始化的 DateTime 属性,因为它表示年份 0001,无法存储在 SQL Server 中的 datetime 列中。

没有相应的属性来用数据注释来定义它。这只有使用 Fluent API 才能实现。

You can specify the type in Fluent API:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2");

This creates a datetime2(7) column in the database. If you want to finetune the precision you can use:

modelBuilder.Entity<Book>()
    .Property(f => f.DateTimeAdded)
    .HasColumnType("datetime2")
    .HasPrecision(0);

... for a datetime2(0) column in the DB.

However, the code you have shown in your question works because the datetime type allows to store dates back to around 1750. The exception occurs only for earlier dates. A common reason for this exception is an uninitialized DateTime property because it represents the year 0001 which can't be stored in a datetime column in SQL Server.

There is no corresponding attribute to define this with data annotations. It's only possible with Fluent API.

左秋 2024-12-21 02:40:10

保存日期时需要填充一个值。这就是您收到此错误的原因。

只需使用DateTime?。不需要上面的魔法。

When saving a date it needs to have a value populated. Thats why you get this error.

Just use DateTime?. There is no need for the magic above.

半衾梦 2024-12-21 02:40:10

您可以使用 datetime2 类型注释类的属性。

public class Book
{
    [Column(TypeName = "datetime2")]
    public DateTime DateAdded { get; set; }
}

You can annotate the attribute of your class with the type datetime2.

public class Book
{
    [Column(TypeName = "datetime2")]
    public DateTime DateAdded { get; set; }
}
樱娆 2024-12-21 02:40:10

如果启用了迁移,您还可以在那里调整内容。

public override void Up()
{
    CreateTable(
        "dbo.MyTable",
        c => new
        {
            Date = c.DateTime(false, 7, storeType: "datetime2"),
        });
}

If migrations are enabled you can also adjust stuff right there.

public override void Up()
{
    CreateTable(
        "dbo.MyTable",
        c => new
        {
            Date = c.DateTime(false, 7, storeType: "datetime2"),
        });
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文