Question

J'ai du mal à enregistrer un enregistrement dans subsonic 3 en utilisant un enregistrement actif. J'ai généré mes objets en utilisant les DAL et TTS et tout semble bien car le test suivant passe. Je pense que ma chaîne de connexion est correcte ou que la génération n'aurait pas réussi.

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

Du côté vivant, le code suivant échoue:

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

Avec un message de: Besoin de spécifier des valeurs ou une requête sélectionnée à insérer - Impossible de continuer! sur la ligne suivante Repo.Add (ce fournisseur); ligne dans mon 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();
        }

Est-ce que je fais quelque chose de horriblement mal ici? Les méthodes de sauvegarde et d'ajout ont des surcharges sans paramètres que je pensais être sûres à utiliser. Dois-je passer un fournisseur? Je suis googlé pour cela pendant un certain temps et je n'ai pas pu trouver quoi que ce soit de spécifique à ma situation. Merci d'avance pour tout type de réponse.

Le schéma de la table est:

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

Il n'y a qu'un seul avertissement pendant la génération et c'est

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

Était-ce utile?

La solution

L'erreur de sélection que vous voyez est subsonique essayant de retirer le PK nouvellement créé, et il ne peut pas. Alors, assurez-vous d'avoir une clé primaire définie pour votre table. Suivant - Assurez-vous qu'il est défini sur Auto Incrément :).

Si cela ne le fait pas, lancez SQL Profiler et voyez ce qui se passe. Aussi - si vous pouviez mettre le schéma de votre table ici afin que je puisse le voir, ce serait utile (il suffit de modifier votre message).

Autres conseils

Cela devrait généralement fonctionner.

Quelques points d'échec possible me viennent à l'esprit:

  • Utilisez-vous un fournisseur MSSQL standard (base de données)?
  • Avez-vous fourni une chaîne de connexion dans web.config (site Web) ou app.config (projet de bibliothèque de classe)?
  • Avez-vous défini une colonne de clé primaire dans la base de données?
  • Votre tableau utilise-t-il plusieurs colonnes de clé primaire? Subson ne peut pas gérer cela. Utilisez une seule colonne d'identification artificielle (Unique Identifier ou INT) dans ce cas.
  • Si la valeur de clé primaire est un champ entier: est-il automatiquement inscrit les valeurs d'ID? Sinon, vous devez définir la valeur de clé principale sur votre objet e-mail avant de l'enregistrer.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top