C# 如何在EF 6中的字符串类型字段上创建唯一约束?
首先,我是MVC新手 我有一个项目表,其中包含ProjectID、ProjectNumber和ProjectDescription字段。ProjectId是int类型的entityKey,ProjectNumber需要是唯一的约束 如何在实体框架6.1.3中实现这一点 在我的专题课上,我有C# 如何在EF 6中的字符串类型字段上创建唯一约束?,c#,asp.net-mvc,entity-framework,entity-framework-6,ef-database-first,C#,Asp.net Mvc,Entity Framework,Entity Framework 6,Ef Database First,首先,我是MVC新手 我有一个项目表,其中包含ProjectID、ProjectNumber和ProjectDescription字段。ProjectId是int类型的entityKey,ProjectNumber需要是唯一的约束 如何在实体框架6.1.3中实现这一点 在我的专题课上,我有 public int ProjectID { get; set; } [Index(IsUnique = true)] [StringLength(200)]
public int ProjectID { get; set; }
[Index(IsUnique = true)]
[StringLength(200)]
public string ProjectNumber { get; set; }
public string ProjectDescription { get; set; }
从模型生成数据库时,该字段在数据库中未设置为唯一
我做错了什么?根据中的答案
请尝试以下代码:
public int ProjectID { get; set; }
[Index("ProjectNumber_Index", IsUnique = true)]
[MaxLength(200)]
public string ProjectNumber { get; set; }
public string ProjectDescription { get; set; }
并确保SQL Server中的字符串未设置为nvarchar(MAX),否则您将首先看到实体框架代码的错误。为了确保,您有一个对此命名空间的引用:
使用System.ComponentModel.DataAnnotations.Schema代码>对吗?另外,尝试添加maxlength属性,看看它是否有区别:[maxlength(200)]
是的,我有对名称空间System.ComponentModel.DataAnnotations.Schema的引用。我对[Index(IsUnique=true)][MaxLength(200)]公共字符串项目编号{get;set;}
进行了更改后,我保存了该类,然后我是否转到模型设计器并从模型生成数据库?是的,尝试[MaxLength(200)]
而不是[StringLength(200)]
,或者如果这不起作用,试着两种方法。在添加唯一约束之前,服务器需要知道字符数有一个限制。我想可能是我误解了什么。通过添加此“[MaxLength(200)][Index(IsUnique=true)]”,创建数据库表的生成脚本是否应该具有add constraint子句?如果您是从模型生成数据库,则它是自动的。如果您正确设置了模型,就不需要担心脚本及其约束。有关StringLength和MaxLength之间差异的更多参考信息:它不适用于我。所有字段均为nvarchar(50)。entitykey是一个int。我不确定我遗漏了什么或者我到底做错了什么。当我插入一个项目编号已存在的记录时,会发生什么情况?它会给您一个DbUpdateException,并显示以下消息:无法在具有唯一索引“index”的对象“db.Project”中插入重复的键行。重复的键值为(…)。声明已终止。
如果我的回答对您仍然没有帮助,恐怕您必须等待比我更有经验的人来回答。对此我深表歉意。@user3726459模型更改后是否创建了数据库(或数据迁移)?@Sampath当我通过转到projectmodel.edmx创建数据库时,在实体旁边的空白处单击鼠标右键,然后选择“从模型生成数据库”。脚本生成后,我运行它。数据库已创建。在我运行数据库脚本并构建解决方案之后,ProjectModel.tt下的project.cs会被覆盖,一旦被覆盖,我添加的代码[Index(“ProjectNumber\u Index”,IsUnique=true)][MaxLength(200)]
就会消失。