【问题标题】:Saving record in Subsonic 3 using Active Record使用 Active Record 在 Subsonic 3 中保存记录
【发布时间】:2010-03-09 23:33:55
【问题描述】:

我在使用 Active Record 保存 Subsonic 3 中的记录时遇到问题。我已经使用 DAL 和 tts 生成了我的对象,一切似乎都很好,因为以下测试通过了。我认为我的连接字符串是正确的,否则生成不会成功。

[Test]
        public void TestSavingAnEmail()
        {
            Email testEmail = new Email();
            testEmail.EmailAddress = "newemail@test.com";
            testEmail.Subscribed = true;
            testEmail.Save();
            Assert.AreEqual(1, Email.All().Count());
        }

在现场,以下代码失败:

protected void btEmailSubmit_Click(object sender, EventArgs e)
        {
            Email email = new Email();
            email.EmailAddress = txtEmail.Text;
            email.Subscribed = chkSubscribe.Checked;
            email.Save();
        }

带有以下消息:需要指定值或要插入的选择查询 - 无法继续!在以下行 repo.Add(this,provider);我的 ActiveRecord.cs 中的行:

public void Add(IDataProvider provider){


            var key=KeyValue();
            if(key==null){
                var newKey=_repo.Add(this,provider);
                this.SetKeyValue(newKey);
            }else{
                _repo.Add(this,provider);
            }
            SetIsNew(false);
            OnSaved();
        }

我在这里做错了什么吗? save 和 add 方法具有我认为可以安全使用的无参数重载。我需要通过提供者吗?我已经为此搜索了一段时间,但无法提出任何特定于我的情况的信息。提前感谢您的任何回答。

表的架构是:

USE [xxxx]
GO
/****** Object:  Table [dbo].[Emails]    Script Date: 03/11/2010 13:15:08 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Emails](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [V_EmailAddress] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [B_Subscribed] [bit] NOT NULL,
    [DT_CreatedOn] [datetime] NOT NULL,
    [DT_ModifiedOn] [datetime] NOT NULL,
 CONSTRAINT [PK_Emails] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

生成过程中只有 1 个警告,即

Multiple template directives were found in the template. All but the first one will be ignored. Multiple parameters to the template directive should be specified within one template directive.

Settings.ttinclude

【问题讨论】:

  • 看来是Sql2005Generator的问题。我在该类中的 Insert 对象的计数为 0,并且选择值为空,因此命中异常。但至于为什么它们是 0 和空的,我不确定。

标签: subsonic subsonic3 subsonic-active-record


【解决方案1】:

您看到的选择错误是 SubSonic 试图拉出新创建的 PK,但它不能。因此,请确保您为表定义了主键。下一步 - 确保它设置为自动增量 :)。

如果还不行 - 启动 SQL Profiler 看看发生了什么。另外-如果您可以将表的架构放在这里以便我可以看到它,那将很有帮助(只需编辑您的消息)。

【讨论】:

  • 罗布,感谢您的回复。我确实为表定义了一个主键,它是一个标识,因此设置为自动递增。架构已添加到上述消息中。我仍然收到错误。也许是因为主键是聚集的?我会试试看是否是问题所在。
  • Rob,我无法从 SQL Profiler 中获取任何有用的信息。使用标准模板,当我尝试运行测试以命中真实数据库时,我看不到任何命中。我再次在模板上运行自定义工具并看到所有这些交易。我很确定表设置正确,但是当我尝试保存对象时,返回的键是 0。我将其追溯到 _repo.Add(this,provider) 和键变量的值KeyValue(); 返回的值为 0。该表设置为从 1 开始递增,所以也许生成没有像我想的那样正常工作?
  • 返回的键值始终为 0。我尝试手动插入一行,其 Id 为 2。所以下次运行测试时它应该得到 3。但是id 返回为 0。似乎 DB 甚至没有被击中....
  • 你在什么排序规则下运行?另外 - 打开您的查询工具并手动在该表中运行 INSERT。然后,添加以下行并告诉我会发生什么: SELECT SCOPE_IDENTITY as new_id 另外 - 在 Github 上获取最新的模板,看看是否能解决问题。
  • Rob,该数据库的排序规则是 SQL_Latin1_General_CP1_CI_AS。我手动添加了几条记录,最后一个被赋予了 ID 5,并且 SELECT NEWID = SCOPE_IDENTITY() 的返回也返回了 5。我会查看 github 模板。
【解决方案2】:

这应该可以正常工作。

我想到了几个可能的失败点:

  • 您使用的是标准的 MSSQL 提供程序(数据库)吗?
  • 您是否在 web.config(网站)或 app.config(类库项目)中提供了连接字符串?
  • 您是否在数据库中设置了主键列?
  • 您的表是否使用多个主键列?亚音速处理不了。在这种情况下,请使用单个人工 ID 列(uniqueidentifier 或 int)。
  • 如果主键值是整数字段:它会自动增加 id 值吗?否则,您必须在保存之前在电子邮件对象上设置主键值。

【讨论】:

  • pagetailor,感谢您的回答。我正在使用 SqlServer 2005 数据库实例。我有一个带有生成对象模型的连接字符串的类库的解决方案,我在 Web 应用程序项目中引用了该 DLL,该项目在 web.config 中设置了相同的连接字符串。我在那个表上没有主键(其余的都有),所以我用主键和模型重新创建了表迁移,但我仍然得到同样的错误。只有 1 PK,int 类型。它是一个身份,应该自动递增。尝试在保存之前在对象上设置 id 会导致相同的错误。
  • 这里是堆栈跟踪的相关部分:" 在 SubSonic.SqlGeneration.Sql2005Generator.BuildInsertStatement()\r\n 在 SubSonic.Query.Insert.BuildSqlStatement()\r\n 在 SubSonic.Query .Insert.GetCommand()\r\n 在 SubSonic.Repository.SubSonicRepository`1.Add(T 项,IDataProvider 提供程序)\r\n
  • 唷,老实说,我当时太紧张了。这正是我使用 SqlServer2008 的方式,而且效果很好。希望其他人可以帮助您-对不起。此外:如果您的PK是一个身份,您甚至不必在保存之前在对象上设置ID。对象保存到数据库后,SubSonic 会自动更新该字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2018-01-16
相关资源
最近更新 更多