質問

アクティブレコードを使用して、Subsonic 3でレコードを保存するのに苦労しています。ダルと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(これ、プロバイダー);私の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

役に立ちましたか?

解決

あなたが見ている選択エラーは、新しく作成されたPKを引き出しようとする亜音速であり、それはできません。したがって、テーブルの主要なキーが定義されていることを確認してください。次に - 自動増分に設定されていることを確認してください:)。

それがそうしない場合 - SQLプロファイラーをキックアップして、何が起こっているのかを確認してください。また - ここにテーブルのスキーマを置くことができれば、それが役に立つでしょう(メッセージを編集するだけです)。

他のヒント

これは一般的に機能するはずです。

失敗のいくつかの可能なポイントが私の頭に浮かぶ:

  • 標準のMSSQLプロバイダー(データベース)を使用していますか?
  • web.config(webサイト)またはapp.config(クラスライブラリプロジェクト)に接続文字列を提供しましたか?
  • データベースにプライマリキー列を設定しましたか?
  • テーブルは複数のプライマリキー列を使用していますか?サブソニックはそれを処理できません。その場合、単一の人工ID列(uniqueidentifierまたはint)を使用します。
  • 一次キー値が整数フィールドである場合:ID値を自動インクレクトしますか?それ以外の場合、電子メールオブジェクトを保存する前に、メールオブジェクトにプライマリキー値を設定する必要があります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top