Я пытаюсь настроить Entity Framework с SQL Server 2008. Я использую Guids для ключей на своих таблицах. Есть ли способ настроить его, чтобы ключи автоматически генерировались базой данных? Я попробовал установить для параметра "RowGuid" значение true, а также установить значение по умолчанию для столбца "(newid())". В любом случае класс сопоставления все еще нуждается в мне, чтобы дать ему руководство на стороне С#. Любые идеи?
Руководство по платформе Entity Framework
Ответ 1
17.4. Могу ли я использовать серверный guid в качестве ключа моего объекта?
К сожалению, в v1 EF это не поддерживается. Хотя с SQL Server возможно иметь столбец типа "uniqueidentifier" и установить его значение по умолчанию "newid()", при этом SQL Server 2000 не имеет хорошего способа извлечь значение, которое генерировал сервер в то время, когда вы сделайте вставку. Однако это можно сделать на более поздних версиях SQL Server, поэтому мы намерены найти чистый путь к специальному случаю этой поддержки в будущих версиях EF, чтобы его можно было поддерживать на тех базах данных, которые позволяют это, а не на другие. На данный момент работа заключается в том, чтобы генерировать guid на клиенте (идеально в конструкторе вашего объекта), а не на сервере.
Ответ 2
Лично я считаю, что любой, кто использует EF, готов отказаться от совместимости с SQL Server 2000, чтобы получить нужные им функции. Кажется, что каждая наполовину нетривиальная вещь, которую мне нужно делать в EF, не поддерживается из-за того, что они должны поддерживать совместимость с SQL Server 2000.
Когда это закончится!
Ответ 3
Так как Guid является структурой, нулевое значение никогда не передается, поэтому значения по умолчанию не срабатывают. Вы можете рассмотреть nullable Guid: Guid?, хотя это может вызвать головные боли, как указано в этом сообщении:
Мне было проще просто инициализировать Guid с новым значением:
private Guid _identifier = Guid.NewGuid();
Если это существующая запись, она будет заменена при заполнении объекта. Если нет, инициализированное значение будет вставлено.
Ответ 4
Легче с v4.
Лучше, чем изменить edmx - это бит, который у меня ниже, который будет генерировать Guid для вас. Он проверяет первичный ключ и отражает его установку.
Предупреждения. Предположим, что один первичный ключ Guid и вы его не настраиваете по какой-то причине.
void OgaraEntities_SavingChanges(object sender, EventArgs e)
{
foreach (ObjectStateEntry entry in
((ObjectContext)sender).ObjectStateManager.GetObjectStateEntries(
EntityState.Added ))
{
if (!entry.IsRelationship){
string keyFieldName = entry.EntitySet.ElementType.KeyMembers[0].Name;
object entity = entry.Entity;
PropertyInfo pi = entity.GetType().GetProperty(keyFieldName);
pi.SetValue(entity, Guid.NewGuid(), null);
}
}
}
Ответ 5
Обновление: Microsoft исправила эту ошибку для VS2010 SP1 с исправление KB2561001.
Ответ 6
Как насчет статического метода в частичном классе?
public partial class SomeEntity
{
public static SomeEntity Create()
{
return new SomeEntity() { Id = Guid.NewGuid(); }
}
}