Entity Framework Guid - PullRequest
       32

Entity Framework Guid

10 голосов
/ 02 декабря 2008

Я пытаюсь настроить Entity Framework с SQL Server 2008. Я использую Guids для ключей на моих таблицах. Есть ли способ настроить его так, чтобы ключи автоматически генерировались базой данных? Я попытался установить для «RowGuid» значение true, а также установить для столбца значение по умолчанию «(newid ())». В любом случае сопоставленный класс все еще нуждается во мне, чтобы дать ему Guid на стороне C #. Есть идеи?

Ответы [ 6 ]

6 голосов
/ 02 декабря 2008

Еще нет :

17.4. Могу ли я использовать guid, сгенерированный сервером, в качестве моего ключа сущности?

К сожалению, в v1 EF это не поддерживается. Хотя в SQL Server возможно иметь столбец типа «uniqueidentifier» и установить его значение по умолчанию равным «newid ()», в SQL Server 2000 нет хорошего способа извлечь значение, сгенерированное сервером в то время, когда вы сделать вставку. Это может быть сделано в более поздних версиях SQL Server, однако, цель состоит в том, чтобы мы нашли чистый способ для особого случая этой поддержки в будущих версиях EF, чтобы она могла поддерживаться в тех базах данных, которые позволяют это, а не другие. В настоящее время обходной путь заключается в создании guid на клиенте (в идеале в конструкторе вашего объекта), а не на сервере.

3 голосов
/ 08 декабря 2008

Лично я думаю, что любой, кто использует EF, захочет отказаться от совместимости с SQL Server 2000, чтобы получить необходимые функции. Кажется, что все наполовину нетривиальные вещи, которые мне нужно сделать в EF, не поддерживаются из-за того, что они должны поддерживать совместимость с SQL Server 2000.

Когда это когда-нибудь закончится!

2 голосов
/ 29 июля 2011

Проще с 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);
    }
  }      
}
2 голосов
/ 02 декабря 2008

Поскольку Guid - это структура, нулевое значение никогда не передается, поэтому значения по умолчанию не вступают в силу. Вы можете рассмотреть nullable Guid : Guid?, Хотя это может вызвать головную боль, как упоминалось в этом почта:

Обнуляемый GUID

Мне было проще просто инициализировать Guid с новым значением:

private Guid _identifier = Guid.NewGuid();

Если это существующая запись, она будет заменена при заполнении объекта. Если нет, инициализированное значение будет вставлено.

1 голос
/ 25 марта 2012

Как насчет статического метода в частичном классе ??

public partial class SomeEntity
{
     public static SomeEntity Create()
     {
         return new SomeEntity() { Id = Guid.NewGuid(); }
     }
}
1 голос
/ 31 октября 2011

Обновление: Microsoft исправила эту ошибку для VS2010 SP1 с исправлением KB2561001 .

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