Pergunta

Estou tendo problemas para economizar um recorde no subsônico 3 usando o registro ativo. Eu gerei meus objetos usando os DALs e TTS e tudo parece bem porque o teste a seguir passa. Eu acho que minha string de conexão está correta ou a geração não teria conseguido.

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

No lado vivo, o seguinte código falha:

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

Com uma mensagem de: necessidade de especificar valores ou uma consulta selecionada para inserir - não posso continuar! na linha a seguir repo.add (este, provedor); linha no meu 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();
        }

Estou fazendo algo terrivelmente errado aqui? Os métodos Salvar e Adicionar têm sobrecargas sem parâmetros que eu achei seguro usar. Eu preciso passar por um provedor? Pesquisei por isso por um tempo e não consegui criar nada específico da minha situação. Agradecemos antecipadamente por qualquer tipo de resposta.

O esquema para a tabela é:

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

Há apenas 1 aviso durante a geração e isso é

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

Foi útil?

Solução

O erro selecionado que você está vendo é subsônico tentando extrair o PK recém-criado, e não pode. Portanto, certifique -se de ter uma chave primária definida para sua tabela. Em seguida - verifique se está definido como incremento automático :).

Se isso não o fizer - faça o perfil do SQL e veja o que está acontecendo. Além disso - se você pudesse colocar o esquema da sua tabela aqui para que eu pudesse vê -la, isso seria útil (basta editar sua mensagem).

Outras dicas

Isso geralmente deve funcionar.

Alguns pontos possíveis de fracasso vêm à minha mente:

  • Você está usando um provedor MSSQL padrão (banco de dados)?
  • Você forneceu uma string de conexão no web.config (site) ou app.config (projeto da biblioteca de classes)?
  • Você definiu uma coluna de chave primária no banco de dados?
  • Sua tabela está usando várias colunas de chave primária? Subsônico não consegue lidar com isso. Use uma única coluna de ID artificial (UniqueIdentifier ou int) nesse caso.
  • Se o valor da chave primária for um campo inteiro: ele incrementam automaticamente os valores de ID? Caso contrário, você precisaria definir o valor principal da chave em seu objeto de email antes de salvá -lo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top