【问题标题】:Entity Framework 4 maps DateTimeOffset to SQL datetime in Visual Studio 2010Entity Framework 4 将 DateTimeOffset 映射到 Visual Studio 2010 中的 SQL 日期时间
【发布时间】:2011-02-08 08:32:39
【问题描述】:

我正在使用带有 .NET/Entity Framework 4 RTM 的 Visual Studio 2010 RTM 以及模型驱动的设计方法。 当我使用 DateTimeOffset 字段创建实体时,EF 建模器尝试将 DateTimeOffset 映射到 SQL 日期时间而不是 SQL 日期时间偏移。 我使用的是 SQL Server 2008 Express,因此数据库支持 datetimeoffset。

Visual Studio 出现此错误:

错误 2019:指定的成员映射无效。类型“Data.SqlStorage.MyType”中成员“Created”的类型“Edm.DateTimeOffset[Nullable=False,DefaultValue=,Precision=]”与“SqlServer.datetime[Nullable=False,DefaultValue=,Precision=] 不兼容3]''Data.SqlStorage.Store.MyTypes 类型的成员'Created'

如果我直接在 EDMX StorageModels xml 部分中编辑类型,我会收到以下错误:

错误 40:类型 datetimeoffset 未使用命名空间或别名进行限定。只有 PrimitiveTypes 可以在没有限定的情况下使用。

为什么建模器不能正确地将其映射到 SQL datetimeoffset 类型? 当我还在使用 Visual Studio 2010 和 .NET framework 4 的 beta 版本时,也出现了这个问题。

【问题讨论】:

    标签: entity-framework visual-studio-2010 datetimeoffset


    【解决方案1】:

    在 RTM 版本中,您可以在 DbContext 中执行以下操作:

     protected override void OnModelCreating(DbModelBuilder modelBuilder) {
         modelBuilder.Entity<EntityName>().Property(p => p.PropertyName).HasColumnType("datetimeoffset");
     }
    

    这对于告诉 Entity Framework Code First 在生成数据库时使用 datetime2 而不是 datetime 也很有用。

    【讨论】:

      【解决方案2】:

      尝试另一种方式(DB->模型)。 It worked for Julie Lerman。在我看来,如果您使用命名空间限定 DateTimeOffset,您手动编辑的 EDMX 也应该可以工作。

      【讨论】:

      • 解决方案是从数据库更新一次。在那之后,一些事情可能得到了修复,因为现在我可以手动将类型更改为 datetimeoffset 而不会 VS 抱怨。还是有点恼火,我不得不手动更改它,而建模器本身并没有正确设置它。
      • 你可以去 DB=>Model 看看它是如何完成的,但我发现在 XML 中添加 precision="7" 属性可以解决这个问题。
      【解决方案3】:

      解决方案是从数据库更新一次,在您手动更改脚本 sql 并生成数据库之后。我做到了,在我检查了我的表映射并将数据类型修改为 DATE 而不是 DATETIME 之后。如果您想更改为 DATETIME2,我认为同样可以应用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-30
        • 2023-03-08
        • 1970-01-01
        • 2011-07-23
        • 2011-06-03
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多