【问题标题】:Define an Unique Key in Entity Framework code-first approch [duplicate]在实体框架代码优先方法中定义唯一键
【发布时间】:2017-01-21 10:45:22
【问题描述】:

我正在尝试在实体框架中定义唯一键约束。

Author 表中Last_Name 属性的唯一键。

我使用的是实体框架 6.0 版。

  1. This answer 使用 Data Annotations 引导我做到这一点
  2. This answer 显示在上下文类中使用 SQL 命令

尝试这样做是最简单的方法。所以我更喜欢数据注释,但我收到了这个错误:

System.Data.SqlClient.SqlException:表中的列“Last_Name” 'dbo.Authors' 的类型不能用作关键列 一个索引。

代码:

public class Author
{
    public Author()
    {
    }

    [Key]
    public int Auth_Id { get; set; }

    public string First_Name { get; set; }  

    [Index("IX_FirstAndSecond", 1, IsUnique = true)]
    public string Last_Name { get; set; }

    public string Biography { get; set; }
}

【问题讨论】:

  • 您可能需要重新考虑该方案。为什么姓氏是唯一的,可以有多个作者具有相同的姓氏
  • 这是一个作者 - 而不是“作者” ....
  • @Ronan 其实这来自我的一次面试测试,他们要求我用唯一的键约束定义 Last_Name 属性
  • 寻找另一家工作的公司;)
  • @InBetween 哈哈 :D

标签: c# entity-framework ef-code-first data-annotations


【解决方案1】:

很可能,问题在于默认情况下,EF 代码优先将所有字符串字段放入数据库中的VARCHAR(MAX) - 无法索引(因为它的大小超过 900 个字节)。

您可能只需要定义一个字符串长度(对于所有您的字符串字段,这将是一个好主意!):

public class Author
{
    public Author()
    {
    }

    [Key]
    public int Auth_Id { get; set; }

    [StringLength(100)]
    public string First_Name { get; set; }  

    [Index("IX_FirstAndSecond", 1, IsUnique = true)]
    [StringLength(100)]
    public string Last_Name { get; set; }

    public string Biography { get; set; }
}

所以现在您的First_NameLast_Name 列在数据库表中应该是VARCHAR(100),并且应该可以正常应用索引。

【讨论】:

  • 是否需要在Last_Name属性上方添加[Key]数据注解?
  • @kez: - ID 已经是你的(主)键...
  • 您对旧 EF 版本的建议是什么?
  • @kez:旧版本的 EF 通常不执行代码优先,也没有此问题。如果您在旧版本中使用并使用代码优先 - 使用相同的方法,应该也可以正常工作
  • 是吗,我想我可能错过了using System.ComponentModel.DataAnnotations.Schema;命名空间:(
猜你喜欢
  • 2011-07-28
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多