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

问题描述:

我在使用活动记录保存Subsonic 3中的记录时遇到问题。我使用DAL和TTS生成了我的对象,因为下面的测试通过,所以一切看起来都很好。我认为我的连接字符串是正确的,否则代不会成功。使用活动记录在Subsonic 3中保存记录

[Test] 
     public void TestSavingAnEmail() 
     { 
      Email testEmail = new Email(); 
      testEmail.EmailAddress = "[email protected]"; 
      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(); 
     } 

我在这里做一些可怕的错误?保存和添加方法具有我认为可以安全使用的无参数重载。我需要通过提供商吗?我已经搜索了一段时间,并没有拿出任何具体的情况。预先感谢您提供任何答案。

该表的模式是:

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

+0

所以它似乎是在Sql2005Generator中的问题。我在该类中的插入对象的计数为0,选择值为空,因此触发异常。但至于为什么他们是零和空我不确定。 – singfoom 2010-03-10 20:12:47

你看到的选择错误是SubSonic试图拉出新创建的PK,而它不能。所以,确保你有一个为你的表定义的主键。接下来 - 确保它设置为自动递增:)。

如果这样做不起作用 - 启动SQL Profiler并查看发生了什么。另外 - 如果你可以在这里放置你的表的模式,所以我可以看到它,这将是有益的(只需编辑你的消息)。

+0

Rob, 感谢您的回复。我确实有一个为表定义的主键,它是一个身份,因此设置为自动增量。架构已添加到上述消息中。我仍然收到错误。也许这是因为主键是聚集在一起的?我会尽力嘲笑它,看看是否是这个问题。 – singfoom 2010-03-11 19:18:19

+0

Rob, 我一直无法从SQL Profiler中获取任何有用的信息。使用标准模板时,当我尝试运行测试打击真实数据库时,看不到任何命中。我再次在模板上运行了自定义工具并查看了所有这些事务。我很确定表格设置正确,但是当我尝试保存该对象时,返回的关键字为0.我将其跟踪到_repo.Add(this,provider)以及关键变量的值由KeyValue();返回0。该表设置为从1开始递增,因此可能代人不正常工作,因为我认为? – singfoom 2010-03-11 19:48:22

+0

返回的键的值始终为0.我尝试手动插入一行,并且ID为2.因此,下一次运行测试时,它应该得到一个3.但是ID返回为0.看起来好像就像数据库甚至没有被击中...... – singfoom 2010-03-11 20:09:40

这通常应该工作。

失败的几个可能的点来我的脑海:

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

pagetailor, 感谢您的回答。我正在使用SqlServer 2005数据库实例。我有一个带有生成对象模型的连接字符串的类库的解决方案,并且我在一个Web应用程序项目中引用该DLL,该项目在web.config中设置了相同的连接字符串。 我没有在该表上的主键(其他人有他们),所以我重新创建了与主键和模型的表迁移,我仍然得到相同的错误。 只有1个PK,int类型。这是一种身份,应该自动递增。尝试在保存结果之前将对象上的标识设置为相同的错误。 – singfoom 2010-03-10 15:46:22

+0

这里是堆栈跟踪的相关部分: “在SubSonic.SqlGeneration.Sql2005Generator.BuildInsertStatement()\ r \ n在SubSonic.Query.Insert.BuildSqlStatement()\ r \ n在SubSonic.Query.Insert.GetCommand( )\ r \ n在SubSonic.Repository.SubSonicRepository'1.Add(T item,IDataProvider provider)\ r \ n – singfoom 2010-03-10 19:33:27

+0

Phew,老实说我是过度训练。 这正是我用SqlServer2008做的,好吧, 希望别人能帮助你 - 对不起 此外:如果你的PK是一个身份,你甚至不必在保存它之前在对象上设置ID,该字段被SubSonic自动更新。对象已保存到DB。 – Shackles 2010-03-10 23:46:07