Subsonic 使用活动记录在亚音速3中保存记录

Subsonic 使用活动记录在亚音速3中保存记录,subsonic,subsonic3,subsonic-active-record,Subsonic,Subsonic3,Subsonic Active Record,我在使用Active record保存亚音速3中的记录时遇到问题。我已经使用DAL和tts生成了我的对象,而且一切看起来都很好,因为下面的测试通过了。我认为我的连接字符串是正确的,否则生成就不会成功 [Test] public void TestSavingAnEmail() { Email testEmail = new Email(); testEmail.EmailAddress = "newemail@tes

我在使用Active record保存亚音速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(本,提供者);my 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
在生成过程中只有一个警告,即

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.

设置。t包括

这通常应该有效

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

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

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


如果不行,启动SQL分析器,看看发生了什么。另外-如果您能将表格的模式放在这里,以便我可以看到,那将非常有用(只需编辑您的邮件)。

pagetailor,谢谢您的回答。我正在使用SQLServer2005DB实例。我有一个带有连接字符串的类库的解决方案,该连接字符串生成对象模型,我在Web应用程序项目中引用该DLL,该项目在Web.config中设置了相同的连接字符串。我在该表上没有主键(其余的表都有主键),所以我用主键和模型重新创建了表迁移,但仍然得到相同的错误。只有1个PK,int类型。它是一个标识,应该自动递增。尝试在保存之前设置对象的id会导致相同的错误。以下是堆栈跟踪的相关部分:“at SubSonic.SqlGeneration.Sql2005Generator.BuildInsertStatement()\r\n at SubSonic.Query.Insert.BuildSqlStatement()\r\n at SubSonic.Query.Insert.GetCommand()\r\n at SubSonic.Repository.SubSonicRepository`1.Add(T项目,IDataProvider提供商)\r\n Hew,老实说,我当时训练过度。这正是我使用SqlServer2008的方式,效果很好。希望其他人能帮助你-抱歉。此外:如果你的PK是一个标识,你甚至不必在保存之前设置对象的ID。一旦对象保存到,该字段将由亚音速自动更新DB.So似乎是Sql2005Generator中的一个问题。该类中我的Insert对象的计数为0,select值为空,因此出现了异常。但至于为什么它们为0且为空,我不确定。Rob,谢谢你的回答。我确实为表定义了主键,它是一个标识,因此设置为au到增量。架构已添加到上述消息中。我仍然收到错误。可能是因为主键是群集的?我将尝试使用它,看看这是否是问题所在。Rob,我无法从SQL Profiler中获得任何有用的信息。使用标准模板,我在尝试运行te时没有看到任何命中st命中了真正的DB。我再次在模板上运行了自定义工具,看到了所有这些事务。我非常确定表设置正确,但当我尝试保存对象时,返回的键是0。我跟踪到了_repo.Add(这个,提供程序),键变量的值是KeyValue()返回的0;。表设置为从1开始递增,所以可能生成没有像我所想的那样正常工作?返回的键的值始终为0。我尝试手动插入一行,该行的Id为2。因此,下次运行测试时,它应该得到3。但是Id返回为0。看起来DB甚至没有被击中……什么c你正在运行的集合?同时-打开你的查询工具并手动在该表中运行一个INSERT。然后,添加以下行并告诉我发生了什么:选择SCOPE\u IDENTITY作为新的\u id也-在Github上获取最新的模板,看看是否可以修复它。Rob,该数据库的排序规则是SQL\u Latin1\u General\u CP1\u CI\u as。我添加了一个couple手动记录,最后一个被赋予ID 5,SELECT NEWID=SCOPE\u IDENTITY()的返回值也返回了5。我将查看github模板。