1

Я работаю на веб-сайте, сначала используя EF 4.1 и базу данных. Я также использую таблицы aspnet, в частности aspnet_Users, который использует Guid в качестве первичного ключа. Следовательно, в моей пользовательской таблице пользователя также есть первичный ключ Guid, который является внешним ключом для идентификатора aspnet_Users.Руководство пуста с newsequentialid() и базой данных EF сначала

Недавно я прочитал, что использование Guid в качестве первичных ключей было плохой идеей, если не используется newsequentialid().

С Sql Server Management Studio я обновил все значения моих основных ключей по умолчанию до newsequentialid() и установил StoreGeneratedPattern в Identity в моем дизайнере edmx.

Однако, когда я пытаюсь добавить объект objet (например, Item, который имеет первичный ключ Guid), его идентификатор остается пустым (все 0) в базе данных.

public void CreateItem() 
{ 
    using (var uof = new UnitOfWork()) 
    { 
     Item item = new Item(); 
     itemRepo.Add(item); 
     uof.Commit(); 
    } 
} 

И метод дополню:

public class RepositoryBase<TObject> where TObject : IEntity 
{ 
    protected CavalenaEntities entities 
    { 
     get { return UnitOfWork.Current.Context; } 
    } 

    public void Add(TObject entity) 
    { 
     entities.Entry(entity).State = System.Data.EntityState.Added; 
    } 
} 

ли я что-то забыл? Хотя я установил значение по умолчанию для первичных ключей моей базы данных, их свойство Default Value в дизайнере edmx по-прежнему None. Это нормально?

Другим решением будет использование int в качестве первичных ключей вместо Guid, но затем как я могу сделать ссылку между моей пользовательской таблицей пользователя и aspnet_Users, в которой используется Guid?

Большое спасибо!

ответ

0

Использование NEWID() абсолютно нормально, если вам не нужны идентификаторы последовательности. Но тогда вам, вероятно, не нужен Guid/uniqueidentifier, вы можете использовать int или bigint и объект идентификации или SQL-последовательности.

+0

Мне действительно не нужны идентификаторы последовательности, но в соответствии с сообщениями, которые я прочитал 'newid()' будет вставлен в любом месте таблицы, а 'newsequentialid()' всегда будет добавлен в конец таблицы, поэтому производительность улучшений вставки. Я нормально использую 'int', но тогда как я могу поддерживать внешний ключ между id aspnet_Users (который является Guid) и моей пользовательской таблицей пользователя (если я изменю свой первичный ключ от Guid до int)? –

+0

Это зависит от того, каков ваш индекс CLUSTER INDEX. Таблица - это не простой список. Физическое хранилище выполняется с помощью b-дерева. Фактически, вставки записей в разных частях таблицы могут сделать INSERT быстрее. Все зависит от вашего CLUSTER INDEX и их коэффициента заполнения. Однако я не думаю, что у вас будет так много новых пользователей, которые нуждаются в оптимизации в INSERT. Это очень быстро. – TcKs

+0

Индекс кластеров - это первичный ключ (я читал, что это поведение по умолчанию, и я его не менял), то есть Guid. Я должен признать, что я не так хорошо знаком с индексами кластеров, но вы на самом деле правы, мне не нужно оптимизировать INSERT. Однако мне нужны большие возможности для поиска. Не будет ли 'newid()' ниже его вообще? –

0

В модельном дизайнере получить свойства Первичного ключа. Найдите StoreGeneratedPattern и измените его с None на Identity. Сохраните все, и теперь первичный ключ будет сгенерирован правильно.

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