Сохранение записи в Subsonic 3 с использованием Active Record - PullRequest
2 голосов
/ 10 марта 2010

У меня проблемы с сохранением записи в Subsonic 3 с использованием Active record. Я сгенерировал свои объекты, используя DAL и tts, и все выглядит хорошо, потому что следующий тест проходит. Я думаю, что моя строка подключения верна, иначе генерация не удалась бы.

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

На живой стороне следующий код завершается ошибкой:

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

с сообщением: Нужно указать значения или выбрать запрос для вставки - не может продолжаться! в следующей строке repo.Add (this, провайдер); строка в моем 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();
        }

Я что-то здесь не так делаю? Методы save и add имеют беспараметрические перегрузки, которые я считаю безопасными для использования. Нужно ли передавать провайдера? Я некоторое время гуглил по этому поводу и не смог придумать что-то конкретное для моей ситуации. Заранее спасибо за любой ответ.

Схема для таблицы:

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

Во время генерации есть только 1 предупреждение, а это

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

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

Ошибка выбора, которую вы видите, - это SubSonic, пытающаяся вытащить только что созданный ПК, но это не может. Поэтому убедитесь, что у вас есть первичный ключ, определенный для вашей таблицы. Далее - убедитесь, что для него установлено значение Автоинкремент:).

Если это не сработает - запустите SQL Profiler и посмотрите, что происходит. Кроме того - если бы вы могли поместить схему вашей таблицы здесь, чтобы я мог ее увидеть, это было бы полезно (просто отредактируйте ваше сообщение).

0 голосов
/ 10 марта 2010

Обычно это должно работать.

Мне вспоминается несколько возможных причин неудачи:

  • Используете ли вы стандартный поставщик MSSQL (база данных)?
  • Вы указали строку подключения в web.config (веб-сайт) или app.config (проект библиотеки классов)?
  • Вы установили столбец первичного ключа в базе данных?
  • Используется ли в вашей таблице несколько столбцов первичного ключа? Дозвуковой не может справиться с этим. В этом случае используйте один столбец искусственного идентификатора (uniqueidentifier или int).
  • Если значение первичного ключа является целочисленным полем: оно автоматически увеличивает значения идентификатора? В противном случае вам придется установить значение первичного ключа в объекте электронной почты перед его сохранением.
...