Вставка нового шаблона записи в SubSonic 3 - PullRequest
2 голосов
/ 01 января 2009

Я пробую новый предварительный просмотр SubSonic 3, но я не уверен насчет шаблонов, которые я должен использовать для основных операций CRUD в моем проекте MVC.

Я пытаюсь сохранить как можно больше своей логики данных в своих моделях, поэтому я добавил несколько статических методов CRUD в частичный класс каждой модели.

Например, допустим, у меня есть таблица конфигурации, в которой должна быть только одна запись. Итак, мой частичный класс может выглядеть примерно так:

public partial class Configuration{
        // cut down; mocking hooks here IRL
        private static IRepository<Configuration> Table = new MyRepository<Configuration>();

        public static Configuration Retrieve()
        {
            var config = Table.GetAll().FirstOrDefault();
            if (config == null)
            {
                config = new Configuration();
                Table.Add(config);
            }
            return config;
        }

        public static void Update(Configuration target)
        {
            Table.Update(target);
        }
}

В настоящее время это не работает, так как в таблице конфигурации есть столбец идентификаторов для первичного ключа, а при добавлении новой записи в таблицу выдается стандартная ошибка «Невозможно вставить явное значение для столбца идентификаторов». SubSonic 3, по-видимому, не генерирует классы, которые при их обновлении хорошо сочетаются с правилами схемы базы данных (т. Е. Без значений по умолчанию, без обнуляемых примитивов для значений, которые обнуляются в базе данных и т. Д.).

Теперь я могу изменить свою таблицу и шаблон, чтобы обойти эти проблемы, но мне интересно, когда я не могу обойти эту проблему - когда мне нужно добавить новую запись в базу данных и иметь личность в качестве моего первичного ключа.

Мне также интересно, является ли этот шаблон даже правильным или нет. SubSonic предлагает вам несколько способов работы с хранилищем, поэтому я не уверен, какой из них мне следует использовать. Я хотел бы использовать мои модели как можно больше (иначе почему бы не просто Linq to Sql?), Поэтому я не хочу использовать добротность построения запросов SubSonic при попытке CRUD моих моделей.

Что мне здесь делать? Любой совет по шаблонам CRUD для использования SubSonic 3 в моем проекте MVC будет приветствоваться и + 'd. Также приветствуются ссылки на веб-сайты, которые освещают эту тему для SubSonic 3, но не имеют высокого рейтинга в поиске Google ...


напрямую спросил Роб ( ссылка здесь ). По крайней мере, для моей БД в сгенерированном коде есть ошибка showtopper. Аааа, альфа софт.


UPDATE

С выходом Subsonic3 , можем ли мы немного поднять этот вопрос?

1 Ответ

3 голосов
/ 30 января 2009

В первую очередь: шаблоны t4 доступны для вас, чтобы изменить их по мере необходимости с SS3. Это было главной идеей использования T4 - я не хочу возвращать вас в мою глупость :).

К рассматриваемому вопросу - я думаю, что это может быть ошибка в наших шаблонах, которая отказывается вставлять значение в поле PK:

    ISqlQuery BuildInsertQuery(T item) {
        ITable tbl = _db.FindTable(typeof(T).Name);
        Insert query = null;
        if (tbl != null) {
            var hashed = item.ToDictionary();
            query = new Insert(_db.Provider).Into<T>(tbl); ;
            foreach (string key in hashed.Keys) {
                IColumn col = tbl.GetColumn(key);
                if (!col.IsPrimaryKey) {
                    query.Value(key, hashed[key]);
                }
            }
        }
        return query;
    }

В этом наш чек должен быть ...

                if (!col.IsPrimaryKey && !col.AutoIncrement) {
                    query.Value(key, hashed[key]);
                }

Таким образом, неидентификация будет вставлена. Но когда я читаю вашу проблему здесь, мне кажется, что вы не пытаетесь вставить ее в неидентификацию.

В электронном письме, которое вы мне прислали, ничего не говорится о PK как об идентичности - ваш PK был предметом под названием «NAme», который представляет собой строковый тип, а не и идентификатор (автоинкремент).

Мне интересно, когда я не могу обойти эту проблему - когда мне нужно добавить новую запись в базу данных и использовать идентификацию в качестве моего первичного ключа.

Это то, что предполагает SubSonic - ваш ПК является столбцом IDENTITY. Если у вас есть ТОЛЬКО столбец IDENTITY, мы не можем вам помочь, потому что это тупиковая таблица, в которую нельзя вставить какое-либо значение, поэтому вы не можете отметить столбец IDENTITY. На данный момент вы можете использовать только команду SET IDENTITY INSERT = "off", что лишает вас цели.

Надеюсь, это ответит на ваш вопрос? Если я не получаю это - вы можете сделать это для меня:

  1. Одно предложение: что вы не можете сделать и в чем ошибка
  2. Что вы ожидали

Спасибо, Уилл, и я надеюсь, что я не толстая.

...