Frage

Ich habe Probleme, einen Rekord in SubSonic 3 mit Active Record zu speichern. Ich habe meine Objekte mit den Dals und TTs generiert und alles scheint in Ordnung zu sein, da der folgende Test besteht. Ich denke, dass meine Verbindungszeichenfolge korrekt ist oder die Generation nicht gelungen wäre.

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

Auf der lebenden Seite schlägt der folgende Code fehl:

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

Mit einer Nachricht von: müssen Werte oder eine zum Einfügen ausgewählte Abfrage angeben - kann nicht weitergehen! in der folgenden Zeile repo.add (this, Anbieter); Linie in meinem 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();
        }

Mache ich hier etwas schrecklich falsches? Die Save and Add -Methoden haben parameterlose Überladungen, die ich für sicher hielt. Muss ich einen Anbieter bestehen? Ich habe dafür eine Weile gegoogelt und konnte mir nichts Besonderes für meine Situation einfallen lassen. Vielen Dank im Voraus für jede Art von Antwort.

Das Schema für die Tabelle lautet:

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

Es gibt nur 1 Warnung während der Generation und das ist

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.

Setts.ttinclude

War es hilfreich?

Lösung

Der Auswahlfehler, den Sie sehen, ist Subsonic, der versucht, den neu geschaffenen PK herauszuziehen, und dies kann nicht. Stellen Sie also sicher, dass Sie einen Primärschlüssel für Ihre Tabelle definiert haben. Als nächstes - stellen Sie sicher, dass es auf automatisches Inkrement eingestellt ist :).

Wenn das nicht der Fall ist, tritt SQL Profiler auf und sehen Sie, was passiert. Außerdem - wenn Sie das Schema Ihrer Tabelle hier einstellen könnten, um es zu sehen, wäre das hilfreich (bearbeiten Sie einfach Ihre Nachricht).

Andere Tipps

Dies sollte im Allgemeinen funktionieren.

Ein paar mögliche Fehlerpunkte kommen mir in den Sinn:

  • Verwenden Sie einen Standard -MSSQL -Anbieter (Datenbank)?
  • Haben Sie eine Verbindungszeichenfolge in der Web.config (Website) oder App.config (Klassenbibliotheksprojekt) angegeben?
  • Haben Sie eine Primärschlüsselspalte in der Datenbank festgelegt?
  • Verwendet Ihre Tabelle mehrere Primärschlüsselspalten? Subsonic kann das nicht bewältigen. Verwenden Sie in diesem Fall eine einzelne künstliche ID -Spalte (Uniqueidentifier oder int).
  • Wenn der Primärschlüsselwert ein Ganzzahlfeld ist: Ist es die ID-Werte automatisch inkrementiert? Andernfalls müssten Sie vor dem Speichern den primären Schlüsselwert in Ihrem E -Mail -Objekt festlegen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top