1

我正在处理 C# 中的 MVC 3 应用程序,该应用程序在更新表中的条目时遇到问题。

从 EF 调用的更新字符串是在日期中发送的(为清楚起见,where 语句中的所有其他值都已删除)

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

实际的数据库条目有日期,sql 数据类型是 datetime2(7):

2012-09-24 19:12:08.6457698

执行代码时,日期不匹配,并且没有任何更新。我使用现有数据库中的逆向工程代码优先创建了我的模型。这是我的模型:

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 将您的列视为 SQLdatetime值而不是较新的datetime2类型。所以试试下面的。

您可以使用[Column(TypeName = "datetime2")]属性上的属性来指示要使用的确切数据库类型,或者HasColumnType如果您更喜欢流畅的配置,则可以使用方法。

于 2012-09-25T17:35:57.857 回答
0

对日期进行完全匹配似乎容易出错。Entity Framework 通常应该根据主键进行更新,例如 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

如果您使用时间戳作为唯一标识符,则必须保证没有两个项目可以具有相同的时间值。如果这确实是您想要做的,请将 CreateDate 表列的精度设置为 datetime2(0) 并在该列上设置一个唯一键。

然而...

在 Aaron 看来,使用时间戳作为唯一标识符可能不是一个好主意。请改用自动递增字段或uniqueidentifier(GUID 类型)字段。

于 2012-09-25T17:18:21.450 回答