Pregunta

Tengo problemas para guardar un registro en Subsonic 3 usando un registro activo. He generado mis objetos usando Dals y TTS y todo parece estar bien porque la siguiente prueba pasa. Creo que mi cadena de conexión es correcta o la generación no habría tenido éxito.

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

En el lado vivo, el siguiente código falla:

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

Con un mensaje de: necesita especificar valores o una consulta de selección para insertar, ¡no se puede continuar! en la siguiente línea Repo.Add (este, proveedor); línea en mi 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();
        }

¿Estoy haciendo algo terriblemente mal aquí? Los métodos Guardar y Agregar tienen sobrecargas sin parámetros que pensé que eran seguros de usar. ¿Necesito aprobar un proveedor? He buscado en Google esto por un tiempo y no pude encontrar nada específico para mi situación. Gracias de antemano por cualquier tipo de respuesta.

El esquema para la mesa es:

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

Solo hay 1 advertencia durante la generación y es

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

¿Fue útil?

Solución

El error de selección que está viendo es subsonic tratando de sacar el PK recién creado, y no puede. Por lo tanto, asegúrese de tener una clave principal definida para su mesa. A continuación, asegúrese de que esté configurado para incrementos automáticos :).

Si eso no lo hace, ponga a SQL Profiler y vea lo que está sucediendo. Además, si pudiera poner el esquema de su mesa aquí para que pudiera verlo, eso sería útil (solo edite su mensaje).

Otros consejos

Esto generalmente debería funcionar.

Me vienen a la mente algunos puntos posibles de falla:

  • ¿Está utilizando un proveedor estándar de MSSQL (base de datos)?
  • ¿Proporcionó una cadena de conexión en Web.Config (Sitio web) o App.Config (Proyecto de Biblioteca de Class)?
  • ¿Estableció una columna de clave principal en la base de datos?
  • ¿Su tabla está utilizando múltiples columnas de clave primaria? Subsonic no puede manejar eso. Use una sola columna de identificación artificial (UniqueIdentifier o INT) en ese caso.
  • Si el valor de clave principal es un campo entero: ¿se adhiere automáticamente los valores de identificación? De lo contrario, tendría que establecer el valor de clave principal en su objeto de correo electrónico antes de guardarlo.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top