Руководство по платформе Entity Framework

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

Ответ 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?, хотя это может вызвать головные боли, как указано в этом сообщении:

Nullable 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);
    }
  }      
}

Ответ 6

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

public partial class SomeEntity
{
     public static SomeEntity Create()
     {
         return new SomeEntity() { Id = Guid.NewGuid(); }
     }
}