【问题标题】:Inserting a new record pattern in SubSonic 3在 SubSonic 3 中插入​​新的记录模式
【发布时间】:2008-12-31 22:58:17
【问题描述】:

我正在试用新的 SubSonic 3 预览版,但我不确定我应该在 MVC 项目中用于基本 CRUD 操作的模式。

我试图在我的模型中保留尽可能多的数据逻辑,因此我向每个模型的部分类添加了一些静态 CRUD 方法。

例如,假设我有一个配置表,它应该只有一条记录。所以,我的部分类可能看起来像这样:

public partial class Configuration{
        // cut down; mocking hooks here IRL
        private static IRepository<Configuration> Table = new MyRepository<Configuration>();

        public static Configuration Retrieve()
        {
            var config = Table.GetAll().FirstOrDefault();
            if (config == null)
            {
                config = new Configuration();
                Table.Add(config);
            }
            return config;
        }

        public static void Update(Configuration target)
        {
            Table.Update(target);
        }
}

目前,这不起作用,因为配置表有一个主键标识列,向表中添加新记录会引发标准的“无法为标识列插入显式值”错误。 SubSonic 3 似乎没有生成类,在更新它们时,它们可以很好地与数据库模式的规则配合使用(即,没有默认值,数据库中可以为空的值没有可以为空的原语等)。

现在,我可以更改我的表格和模式来解决这些问题,但我想知道我什么时候无法解决这个问题——什么时候我必须向数据库并有一个身份作为我的主键。

我也想知道这种模式是否正确。 SubSonic 为您提供了许多不同的方式来处理您的存储库业务,所以我不确定我应该使用哪一种。我想尽可能多地使用我的模型(否则为什么不只是 Linq to Sql?),所以我不想在尝试 CRUD 我的模型时使用 SubSonic 的查询构建优点。

我应该在这里做什么?任何关于在我的 MVC 项目中使用 SubSonic 3 的 CRUD 模式的建议都将受到欢迎和 +'d。也欢迎指向涵盖 SubSonic 3 的该主题但在 Google 搜索中排名不高的网站的链接...


直接询问 Rob (link here)。至少对于我的数据库,在生成的代码中有一个显示错误。啊,阿尔法软件。


更新

有了the release of Subsonic3,我们能不能稍微重新考虑一下这个问题?

【问题讨论】:

    标签: subsonic subsonic3 subsonic-v3p2


    【解决方案1】:

    首先也是最重要的:t4 模板可供您根据 SS3 的需要进行更改。这是使用 T4 的主要思想——我不想让你陷入我的愚蠢:)。

    对于手头的问题 - 我认为这可能是我们的模板中的一个错误,它拒绝将值粘贴到 PK 字段中:

        ISqlQuery BuildInsertQuery(T item) {
            ITable tbl = _db.FindTable(typeof(T).Name);
            Insert query = null;
            if (tbl != null) {
                var hashed = item.ToDictionary();
                query = new Insert(_db.Provider).Into<T>(tbl); ;
                foreach (string key in hashed.Keys) {
                    IColumn col = tbl.GetColumn(key);
                    if (!col.IsPrimaryKey) {
                        query.Value(key, hashed[key]);
                    }
                }
            }
            return query;
        }
    

    在这里,我们的检查实际上应该是......

                    if (!col.IsPrimaryKey && !col.AutoIncrement) {
                        query.Value(key, hashed[key]);
                    }
    

    这样,非标识就会被插入。但是在这里阅读您的问题时,在我看来您并没有尝试插入非身份。

    你发给我的电子邮件没有提到任何关于 PK 作为身份的信息 - 你的 PK 是一个名为“NAme”的东西,它是一个字符串类型,不是和身份(自动递增)。

    我想知道什么时候我无法解决这个问题——什么时候我必须向数据库中添加一条新记录并有一个身份作为我的主键。

    这是 SubSonic 的假设 - 您的 PK 是 IDENTITY 列。如果您只有一个 IDENTITY 列,我们无法帮助您,因为这是一个死锁表,您无法在其中插入任何值,因此您无法勾选 IDENTITY 列。此时,您唯一的办法是 SET IDENTITY INSERT="off",这违背了目的。

    希望这能回答您的问题吗?如果我不明白 - 你能帮我做吗:

    1. 一句话:你不能做什么,有什么错误
    2. 你期待什么

    谢谢威尔,我希望我没有太厚。

    【讨论】:

    • 对,我在论坛上给你的例子和这个不同(我相信,这个例子早于论坛问题)。在此示例中,它试图插入标识值,您的代码修复程序确实回答了该值。但你没有回答最初的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2014-11-14
    • 2011-05-19
    相关资源
    最近更新 更多