【问题标题】:Custom string as Primary Key with Entity Framework使用实体框架将自定义字符串作为主键
【发布时间】:2016-09-23 14:46:21
【问题描述】:

我正在尝试使用 Code First Entity Framework 将个性化字符串设置为主键。

我有一个帮助器,它带有一个返回 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? 我应该在模型中包含帮助程序的代码而不是使用外部类吗?

【问题讨论】:

  • 出于好奇,如果 GUID(大致)相同,为什么还要使用自定义的随机生成的字符串?
  • 您将代码置于风险之中,有可能获得 2 个相同的随机字符串
  • @Bwolfing 主要原因是我想要一些更用户友好的东西。即使转换为 base64,Guid 仍然是 22 个字符长。例如,如果您想在论坛上包含指向您的个人资料的链接,那么较短的链接会更好。
  • @HadiHassan 我想到了这一点,并计划进行验证以确保生成的字符串未被使用。
  • @LehtonenM。说得通!我总是选择整数,因为搜索和比较从根本上来说更容易/更快,但字符串提供了更加用户友好的体验和外观:)

标签: c# asp.net-mvc entity-framework uniqueidentifier


【解决方案1】:

为了方便您的内部应用程序,我仍然会使用 int 作为主键,但还包括另一个属性用于您的唯一字符串索引:

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

字符串列的长度必须有限才能允许索引。

请记住,数据库将按主键对记录进行物理排序,因此具有自动递增的 int 是理想的选择 - 随机生成的字符串并非如此。

【讨论】:

  • 这看起来是我的问题的一个很好的替代方案,我将在我的项目中使用它。
【解决方案2】:

或者通过 EF 流体 api 来实现:

modelBuilder.Entity<Student>()
                .Property(u => u.UniqueStringKey)
                .HasMaxLength(12)
                .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("UQ_UniqueStringKey") { IsUnique = true }));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多