1

テーブル内のエントリの更新に問題がある C# の MVC 3 アプリケーションに取り組んでいます。

EF から呼び出されている更新文字列は、日付をそのまま送信しています(わかりやすくするために、where ステートメントの他のすべての値は削除されています)

where [CreateDate] = '2012-09-24 19:12:08'

実際のデータベース エントリには日付があり、SQL データ型は datetime2(7) です。

2012-09-24 19:12:08.6457698

コードが実行されると、日付が一致せず、何も更新されません。既存のデータベースからリバース エンジニアリング Code First を使用してモデルを作成しました。ここに私のモデルがあります:

public class NPost
{
    [HiddenInput(DisplayValue = false)]
    public int NPostID { get; set; }

    [HiddenInput(DisplayValue = false)]
    public System.Guid UserId { get; set; }

    [Required(ErrorMessage = "Please enter a title!")]
    [StringLength(Int32.MaxValue)]
    public string Title { get; set; }

    [AllowHtml]
    [Required(ErrorMessage = "Please enter the body of the post!")]
    [StringLength(Int32.MaxValue)]
    public string Body { get; set; }

    [Required(ErrorMessage = "Please enter at least one tag!")]
    [StringLength(Int32.MaxValue)]
    public string Tags { get; set; }

    public System.DateTime CreateDate { get; set; }
    public Nullable<System.DateTime> PublishDate { get; set; }
    public Nullable<double> Rating { get; set; }

    [Required(ErrorMessage = "Please enter a topic!")]
    [StringLength(Int32.MaxValue)]
    public string Topic { get; set; }

    [StringLength(Int32.MaxValue)]
    public string TitleImage { get; set; }

    [StringLength(Int32.MaxValue)]
    public string ListingImage { get; set; }

    [StringLength(Int32.MaxValue)]
    public string BoxImage { get; set; }

    public virtual aspnet_Users aspnet_Users { get; set; }
}

これらの日付を揃えて正しく機能させるにはどうすればよいですか?

4

3 に答える 3

1

あなたがここで行っていることに関して他の人が表明した警告に同意します。ただし、あなたの質問にも直接回答する必要があります。EF が列を新しい型datetimeではなくSQL 値として扱っていると思われます。datetime2そこで、以下を試してください。

[Column(TypeName = "datetime2")]プロパティの属性を使用して、使用する正確なデータベースの種類、またはHasColumnType流暢な構成を希望する場合はメソッドを示すことができます。

于 2012-09-25T17:35:57.857 に答える
0

日付を完全に一致させると、エラーが発生しやすくなります。Entity Framework は通常、主キーに基づいて更新を行う必要があります。たとえば、Where NPostId = 50 です。コントローラーの更新を ID に基づくように変更できますか?

var postById = context.Posts.Where(p => p.NPostId == id).First();
postById.Text = text;
...
context.Entry(postById).State = EntityState.Modified;
postById.SaveChanges();
于 2012-09-25T17:17:56.180 に答える
-1

タイムスタンプを一意の識別子として使用している場合は、2 つのアイテムが同じ時間値を持つことができないことを保証する必要があります。それが本当に必要な場合は、CreateDate テーブル列の精度を datetime2(0) に設定し、列に一意のキーを設定します。

でも...

アーロンの指摘によれば、タイムスタンプを一意の識別子として使用することは、おそらく良い考えではありません。代わりに、自動インクリメント フィールドまたはuniqueidentifier(GUID タイプの) フィールドを使用してください。

于 2012-09-25T17:18:21.450 に答える