2016-09-23 2 views
3

Я пытаюсь настроить персонализированную строку как первичный ключ с помощью Code First Entity Framework.Пользовательская строка как первичный ключ с базой объектов

У меня есть помощник с функцией, которая возвращает случайную строку n-символов, и я хочу использовать ее для определения моего идентификатора, как для видеокодека YouTube.

using System.Security.Cryptography; 

namespace Networks.Helpers 
{ 
    public static string GenerateRandomString(int length = 12) 
    { 
     // return a random string 
    } 
} 

Я не хочу использовать автоинкрементный целые (не требуется, чтобы пользователи с помощью бот слишком легко, чтобы посетить каждый пункт), ни Guid (слишком долго, чтобы показать пользователь).

using Networks.Helpers; 
using System; 
using System.ComponentModel.DataAnnotations; 

namespace Networks.Models 
{ 
    public class Student 
    { 
     [Key] 
     // key should look like 3asvYyRGp63F 
     public string Id { get; set; } 
     public string Name { get; set; } 
    } 
} 

Можно ли определить, как должен быть присвоен идентификатор непосредственно в модели? Должен ли я включать код помощника в модель вместо использования внешнего класса?

+2

из любопытства, зачем использовать обычай, сгенерированный случайным образом строка, если GUID является (приблизительно) то же самое? – Bwolfing

+1

Вы подвергаете свой код риску, есть возможность получить две одинаковые случайные строки – Monah

+1

@Bwolfing Основная причина в том, что я хотел что-то более удобное для пользователя. Гид, даже если он преобразован в base64, по-прежнему составляет 22 символа. Например, если вы хотите включить ссылку на свой профиль на форуме, более короткий выглядит лучше. –

ответ

4

Я все еще использую Int в качестве первичного ключа для удобства в вашем внутреннем приложении, но и включают в себя еще одно свойство для вашего уникального индекса строки:

[Index(IsUnique=true)] 
[StringLegth(12)] 
public string UniqueStringKey {get;set;} 

Столбец строка должна быть конечной длины, чтобы позволить индекс.

Помните, что db будет физически сортировать записи по первичному ключу, поэтому для этого автоматически создается инкрементирующий int int - беспорядочно сгенерированные строки не так.

+0

Это похоже на хорошую альтернативу моей проблеме, я буду использовать ее в своем проекте , –

1

Или это с помощью EF апи жидкости:

modelBuilder.Entity<Student>() 
       .Property(u => u.UniqueStringKey) 
       .HasMaxLength(12) 
       .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UQ_UniqueStringKey") { IsUnique = true })); 
Смежные вопросы