【问题标题】:SubSonic 3.0 Simple Repository Adding a DateTime Property To An ObjectSubSonic 3.0 简单存储库向对象添加日期时间属性
【发布时间】:2009-09-08 12:56:44
【问题描述】:

我正在试用 SubSonic,看看它是否可以用于生产项目。我似乎偶然发现了一个关于在创建新列时使用默认值(字符串和日期时间)更新数据库的问题。

如果将 DateTime 或 String 的新属性添加到对象。

public class Bug
{
    public int BugId { get; set; }
    public string Title { get; set; }
    public string Overview { get; set; }
    public DateTime TrackedDate { get; set; }
    public DateTime RemovedDate { get; set; }
}

当运行将该类型对象添加到数据库的代码时

var repository = new SimpleRepository(SimpleRepositoryOptions.RunMigrations);           

repository.Add(new Bug()
{
    Title = "A Bug",
    Overview = "An Overview",
    TrackedDate = DateTime.Now
});

它创建以下 sql:

UPDATE Bugs SET RemovedDate=''01/01/1900 00:00:00''

由于某种原因,它在字符串或 DateTime 的每一端添加双 2 个单引号。

这会导致以下错误:

System.Data.SqlClient.SqlException - '01' 附近的语法不正确

我正在连接到 SQL Server 2005

除此问题外,我发现 SubSonic 是一款很棒的产品。


我创建了我的错误here 的屏幕截图:

【问题讨论】:

  • 这是否会导致错误,或者您想知道为什么将 RemovedDate 设置为该值?如果它导致错误,您使用的是哪个数据库,错误是什么?
  • 感谢 Adam 的回复,这导致我在问题中添加了一个错误。
  • @Blounty:您不需要在代码 blocks 中使用反引号。四个空格前缀就够了。我为你删除了那些。
  • 您能否发布 repo.Add 生成的完整 SQL。我很困惑为什么当它应该执行 INSERT 时会导致 UPDATE
  • 它会导致更新,因为它是一个 NOT NULL 列,因此必须使用默认数据填充任何前面的行。

标签: c# asp.net-mvc subsonic subsonic3


【解决方案1】:

这是一个错误,双引号是在几转前引入的。我相当肯定这已经修复 > 3.0.0.3,所以如果你想抓住当前的下降,应该处理它。

很抱歉造成混淆 - 但正如您发现的那样,您可以在 create 上设置值,这将对问题进行排序。此外,您可以按照 andymeadows 的建议进行操作,这将使该字段可以为空(这可能更准确)。

无论如何 - 我们很快就会解决这个问题 :)。我正在努力找工作,没有太多的周期来合并分支:(

【讨论】:

  • 感谢您的回复。如果您可以通勤到英国诺丁汉,我相信我们可以为您安排一个职位。 :)
【解决方案2】:

尝试将 RemovedDate 的类型从 DateTime 更改为 DateTime?

public class Bug
{
    public int BugId { get; set; }
    public string Title { get; set; }
    public string Overview { get; set; }
    public DateTime TrackedDate { get; set; }
    public DateTime? RemovedDate { get; set; }
}

【讨论】:

  • 但我希望该字段不为空。如果我这样做了,它只会使其为 Nullable。
【解决方案3】:

好吧,这看起来绝对是一个错误,您不会说该 UPDATE 语句上是否有 WHERE 子句,但如果没有,那就更多了。请将其作为问题报告给github,并附上要复制的测试用例。 与此同时,您可以通过在代码中设置 RemovedDate 的值来解决这个问题,例如

repository.Add(new Bug()
{
  Title = "A Bug",
  Overview = "An Overview",
  TrackedDate = DateTime.Now
  RemovedDate = DateTime.Now // Set it as required here Now's just an example
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多