2013-12-17 6 views
3

Я хочу установить значение по умолчанию для моего первичного ключа таблицы в базе данных SQL с помощью newid() через Entity Framework 6 Code First. Я знаю, как это делается с помощью кода, а также нашел несколько подходов на StackOverflow, как How to set NewId() for GUID in entity frameworknewid() с Entity Framework 6 Сначала код

НО: У меня есть резервное копирование/восстановление механизм, который вставляет данные не через объекты, но только как выпуклость в базу данных. Таким образом, здесь не используется Entity Framework. Это означает, что строка с нулевым значением как guid будет вставлена ​​в базу данных SQL и завершится с ошибкой.

Можно добавить аннотацию

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public Nullable<Guid> Entity_OID { get; set; } 

И это будет успешно добавить NEWSEQUENTIALID() в качестве значения по умолчанию, что делает подобную вещь, как NEWID() (это добавляет новый GUID, который должен быть выше последние лидеры, так что вы выиграете партию, потому что у вас есть заказ на вкладке). Но поскольку это база данных, которая уже существует без EF, я хочу сделать как можно меньше изменений. Поэтому я не очень доволен NEWSEQUENTIALID(). Я бы предпочел, чтобы он был еще просто новым(). Но я не нашел никаких аннотаций/сопоставлений для newid() в Entity Framework 6 Code First. И по дизайну все изменения в базе данных должны выполняться с помощью кода. Кто-нибудь знает, как добавить значение по умолчанию newid() в строку с помощью кода?

Заранее благодарен!

+0

Не можете ли вы просто не использовать автоматически сгенерированные ключи и установить значение ключа в ctor? Я думаю, что GUID гарантированно уникальны, поэтому не имеет значения, генерируются ли они из базы данных или вашего кода, и вы не должны входить в ситуацию, когда один и тот же guid генерируется для двух объектов (опять же - поскольку GUID должны быть глобальными unique) – Pawel

+0

Да, я могу это сделать, и это работает для объектов, созданных в моем коде через Buisness Logic. Но если я восстанавливаю файл cbak через поток, где не создаются сущности, то база данных должна их генерировать. –

ответ

2

Кажется, что я пытался сделать, это невозможно в Code First. И с

[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
public Nullable<Guid> Entity_OID { get; set; } 

Entity Framework также будет генерировать новый Guid, даже если я устанавливаю до начала context.SaveChanges(), который не является поведение, я ожидал.

0

Когда вы отмечаете свойство с DatabaseGeneratedOption.Identity EF получает сгенерированное значение из БД после каждой операции вставки и устанавливает его в свойство. В БД вы можете сделать все, например, создать ограничение по умолчанию для newid() для столбца.

Смежные вопросы