Отключение временного удостоверения - Entity Framework 4.1 Code First - PullRequest
1 голос
/ 20 октября 2011

У меня проблема с созданием идентификатора снова, когда я импортирую данные в базу данных с другим идентификатором.Все данные импортируются правильно, просто то, что идентификатор (столбец идентификатора) должен быть тем, чем является импорт.

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

Все это устанавливается с помощью OnModelCreating для DatabaseContext из класса DbContext:

        modelBuilder.Entity<Observation>().HasKey(m => new {m.Instance, m.Id});
        modelBuilder.Entity<Observation>().Property(m => m.Id).HasDatabaseGeneratedOption(
            DatabaseGeneratedOption.Identity);

Класс выглядит следующим образом:

public class Observation
{
    public string Instance { get; set; }
    public int Id { get; set; }
    ...
}

Контекст базы данных создается только один раз в этом приложении ASP.Net MVC 3 с Ninject.

Я попытался использовать команду SQL для отключения идентификациипри добавлении новой записи, но безуспешно:

    public void SetIdentiyObservation(bool isOn)
    {
        var state = isOn ? "ON" : "OFF";
        _context.Database.SqlQuery<Observation>("SET IDENTITY_INSERT Observation @state", new SqlParameter("state", state));
    }

Созданная структура таблицы в MSSQL выглядит следующим образом:

CREATE TABLE [dbo].[Observations](
[Instance] [nvarchar](128) NOT NULL,
[Id] [int] IDENTITY(1,1) NOT NULL,
    ...
PRIMARY KEY CLUSTERED 
(
[Instance] ASC,
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Любая помощь по этому вопросу приветствуется:)

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Спасибо за ввод данных по течению, я решил эту проблему, вернувшись к основам и исключив потребности клиентов из потребностей базы данных. Завершается столбцом для хранения требований клиента, например, экземпляра + id, и затем база данных может жить своей собственной жизнью с внутренним идентификатором:)

0 голосов
/ 20 октября 2011

SqlQuery<T> возвращает IEnumerable, и SQL-запрос не выполняется до тех пор, пока вы его не перечислите.Если вы добавите .ToList() в конце оператора, вы получите исключение, говорящее о том, что синтаксис неверен.Вы также столкнетесь с проблемами, когда EF попытается отобразить результат в Observation.

. Я наконец смог запустить его, используя следующую команду:

_context.Database.SqlQuery<object>("SET IDENTITY_INSERT Observation " + (isOn ? "ON" : "OFF")).ToList();

до последней проблемы, которую я не мог решить.Поскольку Id помечен как сгенерированный базой данных, EF не включает его значение в оператор INSERT.

Если вы можете найти способ изменить значение DatabaseGeneratedOption на Id во время выполнения, вы можете добавить сущность, используя ваш контекст.К сожалению, я не знаю, как это сделать, и единственный способ, которым я мог вставить строку с указанным Id, - это использовать базовое соединение и выполнить необходимый sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...