自定义字符串作为 Entity Framework 的主键
Custom string as Primary Key with Entity Framework
我正在尝试使用 Code First 将个性化字符串设置为主键 Entity Framework。
我有一个助手,它的功能是 returns 一个 n 字符的随机字符串,我想用它来定义我的 Id,就像 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; }
}
}
是否可以定义必须如何在模型中直接分配 ID?
我应该在模型中包含助手代码而不是使用外部 class 吗?
为方便起见,我仍会在您的内部应用程序中使用 int 作为主键,但还会包含另一个 属性 作为您的唯一字符串索引:
[Index(IsUnique=true)]
[StringLegth(12)]
public string UniqueStringKey {get;set;}
字符串列的长度必须有限才能允许索引。
请记住,数据库将按主键对记录进行物理排序,因此拥有一个自动递增的 int 是理想的选择 - 随机生成的字符串并非如此。
或者通过 EF fluid api:
modelBuilder.Entity<Student>()
.Property(u => u.UniqueStringKey)
.HasMaxLength(12)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UQ_UniqueStringKey") { IsUnique = true }));
我正在尝试使用 Code First 将个性化字符串设置为主键 Entity Framework。
我有一个助手,它的功能是 returns 一个 n 字符的随机字符串,我想用它来定义我的 Id,就像 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; }
}
}
是否可以定义必须如何在模型中直接分配 ID? 我应该在模型中包含助手代码而不是使用外部 class 吗?
为方便起见,我仍会在您的内部应用程序中使用 int 作为主键,但还会包含另一个 属性 作为您的唯一字符串索引:
[Index(IsUnique=true)]
[StringLegth(12)]
public string UniqueStringKey {get;set;}
字符串列的长度必须有限才能允许索引。
请记住,数据库将按主键对记录进行物理排序,因此拥有一个自动递增的 int 是理想的选择 - 随机生成的字符串并非如此。
或者通过 EF fluid api:
modelBuilder.Entity<Student>()
.Property(u => u.UniqueStringKey)
.HasMaxLength(12)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UQ_UniqueStringKey") { IsUnique = true }));