2

最初に EF データベースを使用してデータベースに接続しています。したがって、私のモデルは自動生成されます。

レコードを更新すると、DateTimes が SQL 型 DateTime2 として書き込まれます。運用サーバーは SQL Server 2005 (コメントはお控えください) であるため、DateTime2 がサポートされていないため、更新は失敗します。

http://www.asp.net/mvc/overview/getting-started/database-first-development/enhancing-data-validationに従ってモデルのメタデータ クラスを作成し、メンバーを [Column( DbType = "datetime")] ですが、指示に従っていないか、間違った方向に進んでいます。

データベースへの書き込み時に最初に EF データベースに DateTime を使用させるにはどうすればよいですか?

ありがとう

4

3 に答える 3

3

DateTimeのEntity Framework標準はDateTime2フィールドであるため、過去にこの問題が発生しました。明らかに回避策は、SQL Serverデータベースのすべての列をdatetime2に更新することですが、datetime2データ型はSQL Server 2008でのみ導入されたため、ここで試してみるべきことがいくつかあります:

最初に: SQL データベースの DateTime フィールドが nullableである場合、モデルが "DateTime?" を使用していることを確認してください。(nullable datetime) "DateTime" の代わりに。

次に、任意の XML エディターで EDMX ファイルを開き (Visual Studio が動作するはずです)、値を に変更します。これProviderManifestTokenによりProviderManifestToken="2005"、SQL Server 2005 との互換性が確保されます。

これは .edmx ファイルでは機能しますが、Code First での変更は少し難しく、Entity Framework のバージョンによって異なります。Microsoft では、次の例のように、OnModelCreating メソッドで列の型を指定することをお勧めします。

modelBuilder.Entity<Blog>().Property(t => t.CreatedOn).HasColumnName("CreatedOn").HasColumnType("date");

目的に達するまで、ColumnType の値を試してみてください。

それでも値を変更したいProviderManifestToken場合:

EF 6: DbContext の構成を作成できます。基本的には次のようなクラスです。

/// <summary>
/// A configuration class for SQL Server that specifies SQL 2005 compatability.
/// </summary>
internal sealed class EntityFrameworkDbConfiguration : DbConfiguration
{
    /// <summary>
    /// The provider manifest token to use for SQL Server.
    /// </summary>
    private const string SqlServerManifestToken = @"2005";

    /// <summary>
    /// Initializes a new instance of the <see cref="EntityFrameworkDbConfiguration"/> class.
    /// </summary>
    public EntityFrameworkDbConfiguration()
    {
        this.AddDependencyResolver(new SingletonDependencyResolver<IManifestTokenResolver>(new ManifestTokenService()));
    }

    /// <inheritdoc />
    private sealed class ManifestTokenService : IManifestTokenResolver
    {
        /// <summary>
        /// The default token resolver.
        /// </summary>
        private static readonly IManifestTokenResolver DefaultManifestTokenResolver = new DefaultManifestTokenResolver();

        /// <inheritdoc />
        public string ResolveManifestToken(DbConnection connection)
        {
            if (connection is SqlConnection)
            {
                return SqlServerManifestToken;
            }

            return DefaultManifestTokenResolver.ResolveManifestToken(connection);
        }
    }
}

使用法:

DbConfigurationType(typeof(EntityFrameworkDbConfiguration))]
public class MyContextContext : DbContext
{
}

(ソース: EF Code First の ProviderManifestToken を構成する方法)

EF 5 以前: 簡単に説明されているこの投稿を読んでください: http://blog.oneunicorn.com/2012/04/21/code-first-building-blocks/

それが役立つことを願っています。

于 2015-09-24T15:44:45.287 に答える
0

データベースを削除して解決し、パッケージ マネージャー コンソールで update-database コマンドを再度実行します。ただし、本番環境には適していません。

于 2015-10-26T03:35:12.020 に答える