Domanda

Ho problemi salvare un record in Subsonic 3 utilizzando record attivo. Ho generato i miei oggetti utilizzando i dals e TTS e tutto sembra bene perché il seguente test passa. Credo che la mia stringa di connessione è corretto o la generazione non avrebbe avuto successo.

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

Dal punto di vista dal vivo, il seguente codice fallisce:

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

con un messaggio di: necessità di specificare Valori o una query di selezione per inserire - non può andare avanti! al seguente linea di repo.Add (questo, fornitore); linea nei miei 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();
        }

Sto facendo qualcosa di terribilmente sbagliato qui? I metodi di salvare e aggiungere hanno sovraccarichi senza parametri che ho pensato che fosse sicuro da usare. Ho bisogno di passare un fornitore? Googled in giro per questo per un po 'e non è riuscito a venire con qualcosa di specifico per la mia situazione. Grazie in anticipo per qualsiasi tipo di risposta.

Lo schema per la tabella è:

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

C'è solo 1 avviso durante generazione e che è

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

È stato utile?

Soluzione

L'errore di selezione che stai vedendo è SubSonic cercando di tirare fuori il PK appena creato, e non può. Quindi, essere sicuri di avere una chiave primaria definita per la vostra tavola. Avanti - assicurarsi che sia impostata su Auto Increment:)

.

Se questo non lo fa - calci SQL Profiler e vedere cosa succede. Inoltre -. Se si potrebbe mettere lo schema della tabella qui così ho potuto vedere, che sarebbe utile (basta modificare il messaggio)

Altri suggerimenti

Questo dovrebbe in generale lavorare.

Alcuni possibili punti di fallimento mi vengono in mente:

  • Stai usando un provider di MSSQL standard (database)?
  • Hai fornito una stringa di connessione nel web.config (sito web) o app.config (progetto di libreria di classi)?
  • Lo si imposta una colonna di chiave primaria nel database?
  • È il vostro tabella utilizzando più colonne chiave primaria? Subsonic non è in grado di gestire questo. Utilizzare una singola colonna ID artificiale (uniqueidentifier o int) in quel caso.
  • Se il valore della chiave primaria è un campo intero: lo fa incremento automatico dei valori id? In caso contrario, ci si deve impostare il valore della chiave primaria sul vostro oggetto e-mail prima di salvarlo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top