2010-03-09 80 views
2

我在使用活動記錄保存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

回答

2

你看到的選擇錯誤是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

0

這通常應該工作。

失敗的幾個可能的點來我的腦海:

  • 您使用的是標準的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