2015-01-14 3 views
0

Я хочу реализовать GUID в качестве основного ключа в своих моделях. Я использую подход, основанный на модели, и хочу, чтобы GUID был создан не в базе данных, а на сервере .NET.Entity Framework: использование GUID в качестве первичного ключа

Я видел решение, сказал, что я должен сделать это для каждого класса:

public class TestObject 
{ 
    public TestObject() 
    { 
     Id = Guid.NewGuid(); 
    } 

    public Guid Id { get; set; } 
} 

Проблема заключается в том, что: я не думаю, что это чистое решение, применяя это к каждому класс у меня есть.

И у меня нет классов POCO, потому что я использую сначала модель.

Итак, что мне делать? Как вы думаете, это лучший подход? Любой совет?

+3

прочитанное Ким Трипп (в http://www.sqlskills.com/blogs/kimberly/guids-as-primary-keys-andor-the- кластеризация ключ /). С точки зрения DBA, GUID как ваш ПК является ** ужасно плохим ** выбором из-за массивной фрагментации и, следовательно, массовых отрицательных результатов. Если у вас есть роскошь разработки новой системы баз данных - ** НЕ используйте GUID в качестве основных ключей! –

+0

Я не уверен, что так плохо использовать guid как PK: я думаю, что есть несколько преимуществ. Когда мне нужно объединить похожие таблицы, исходящие из разных dbs (таблицы заказов в приложении для продаж), у меня нет записи из разных dbs с тем же PK, который должен быть реорганизован, и если я выставляю PK в веб-приложении (строка запроса и т. д.). У меня немного более высокая безопасность при 0 стоимости, потому что сложнее угадать другие записи, что намного проще, когда вы видите, что ПК является типичным целым числом автоинкремент. Вы не можете основывать безопасность на этом, но на 0 стоимости. –

+0

Я хочу использовать GUID из-за того, что говорит Лука ... Я знаю, что он не имеет лучшей производительности, но мне нужно это сделать. Кто-нибудь из вас знает, как я могу делать то, что я прошу? –

ответ

0

В этом случае, а также ответить на вопрос, независимо от любых других соображений, вы должны:

  • переопределения SaveChanges метода
  • искать добавленные лицо
  • установить их ID.

, если ваши классы реализуют интерфейс, такие как

interface { 
    Guid Id {get; set;} 
} 

ваша задача будет облегчена.

0

Поскольку все ваши сущности, как первичный ключ, имеют Id, наиболее очевидным является изменение шаблона t4, поэтому инициализация guid генерируется.

В текущем шаблоне t4 для генерации объекта (что-то вроде ModelName.tt) поколения конструктор начинается с ...

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public <#=code.Escape(entity)#>() 
    { 
<# 
     foreach (var edmProperty in propertiesWithDefaultValues) 

(В моем шаблоне он начинается в строке 37)

Изменение этого в. [GUID, первичный ключ и кластерный ключ в SQL Server] ..

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public <#=code.Escape(entity)#>() 
    { 
       this.Id = Guid.NewGuid(); 
<# 
     foreach (var edmProperty in propertiesWithDefaultValues)