Я работаю на веб-сайте, сначала используя 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?
Большое спасибо!
Мне действительно не нужны идентификаторы последовательности, но в соответствии с сообщениями, которые я прочитал 'newid()' будет вставлен в любом месте таблицы, а 'newsequentialid()' всегда будет добавлен в конец таблицы, поэтому производительность улучшений вставки. Я нормально использую 'int', но тогда как я могу поддерживать внешний ключ между id aspnet_Users (который является Guid) и моей пользовательской таблицей пользователя (если я изменю свой первичный ключ от Guid до int)? –
Это зависит от того, каков ваш индекс CLUSTER INDEX. Таблица - это не простой список. Физическое хранилище выполняется с помощью b-дерева. Фактически, вставки записей в разных частях таблицы могут сделать INSERT быстрее. Все зависит от вашего CLUSTER INDEX и их коэффициента заполнения. Однако я не думаю, что у вас будет так много новых пользователей, которые нуждаются в оптимизации в INSERT. Это очень быстро. – TcKs
Индекс кластеров - это первичный ключ (я читал, что это поведение по умолчанию, и я его не менял), то есть Guid. Я должен признать, что я не так хорошо знаком с индексами кластеров, но вы на самом деле правы, мне не нужно оптимизировать INSERT. Однако мне нужны большие возможности для поиска. Не будет ли 'newid()' ниже его вообще? –