C# Ef代码带导航属性的第一个索引,不添加Id
我有一个名为UserTag的EF代码第一类 UserTag具有以下两个属性C# Ef代码带导航属性的第一个索引,不添加Id,c#,entity-framework,entity-framework-migrations,ef-fluent-api,C#,Entity Framework,Entity Framework Migrations,Ef Fluent Api,我有一个名为UserTag的EF代码第一类 UserTag具有以下两个属性 public string TagText { get; set; } public UserGroup UserGroup { get; set; } 现在我需要一个索引,使TagText在用户组中是唯一的。但是相同的TagText应该能够存在于两个不同的用户组中 我有两个问题,一个是TagText不能是它变成的varchar(max),第二个是我没有一个UserGroupId来连接索引 我想使用FLUENT API
public string TagText { get; set; }
public UserGroup UserGroup { get; set; }
现在我需要一个索引,使TagText在用户组中是唯一的。但是相同的TagText应该能够存在于两个不同的用户组中
我有两个问题,一个是TagText不能是它变成的varchar(max),第二个是我没有一个UserGroupId来连接索引
<>我想使用FLUENT API,但是可以考虑改变我的迁移的上移和下移。
但是我不想在TagText上添加UserGroupId和注释。这可能吗
最好是流畅的API,但编辑迁移也可以。编辑:
我看错了您的问题,我将在底部保留我的原始答案(我读得太多了,您不想在模型中添加ForeignKey属性)
编辑答案:
使用fluentapi是可行的
基本上,您必须配置EF如何将导航属性(用户组)映射到数据库(外键列的名称,它在您的模型中不存在)并在其上放置索引属性/注释
为了解决TagText列长度(默认情况下为nvarchar(max),因此不能作为索引的一部分(太长,会出现SQL异常)),您还可以使用fluent API并使用.HasMaxLength(StringLengthThatMakesSense)。这也可以通过在模型中放置注释来实现(请参见下面我的旧答案)
旧答案: 您的问题有多种解决方案 正如您已经提到的,您总是可以在数据库迁移中这样做,只需使用两列创建唯一的索引(我猜关系模型包含UserGroupId) 为了通过数据注释创建唯一索引,您需要像这样扩展您的模型(这需要EF 6.1): 我公开了ForeignKey属性(信息:我不能100%确定是否需要此属性,可能直接将其放在navigationproperty上时也可以使用)。这是按照约定工作的(通过将FK属性命名为带有Id后缀的NavigationProeProperty。我假设用户组的Id是一个整数)。您可以在msdn上阅读有关此约定的更多信息(请参阅答案底部的链接) 我还添加了一个StringLength属性,因为否则EF通常会创建一个NVARCHAR(MAX)列,该列在SQL Server中不起作用,因为它超过了最大索引长度(正如您在回答中已经提到的)。这还将使EF在调用SaveChanges时验证属性的长度,而不必访问数据库(但这可以被禁用) 另一个选项是通过Fluent Api执行此操作:
public class UserTag {
[StringLength(128)]
[Required]
[Index("UI_UserGroupTagtext", 2, IsUnique = true)]
public string TagText { get; set; }
[Index("UI_UserGroupTagtext", 1, IsUnique = true)]
public int UserGroupId { get; set; }
public UserGroup UserGroup { get; set; }
}
modelBuilder.Entity<UserTag>
.Property(t => t.TagText )
.HasMaxLength(128)
.IsRequired()
.HasUniqueIndexAnnotation("UI_UserGroupTagtext", 2);
modelBuilder.Entity<UserTag>
.Property(t => t.UserGroupId)
.HasUniqueIndexAnnotation("UI_UserGroupTagtext", 1);
modelBuilder.Entity
.Property(t=>t.TagText)
.HasMaxLength(128)
.IsRequired()
.HasUniqueIndexAnnotation(“UI_UserGroupTagtext”,2);
modelBuilder.Entity
.Property(t=>t.UserGroupId)
.HasUniqueIndexAnnotation(“UI_UserGroupTagtext”,1);
在本例中,我还为TagText添加了MaxLength信息(以及必需的信息,因为这似乎至少对我来说是有意义的…)
您可以阅读有关EF和索引的更多信息
public class UserTag {
[StringLength(128)]
[Required]
[Index("UI_UserGroupTagtext", 2, IsUnique = true)]
public string TagText { get; set; }
[Index("UI_UserGroupTagtext", 1, IsUnique = true)]
public int UserGroupId { get; set; }
public UserGroup UserGroup { get; set; }
}
modelBuilder.Entity<UserTag>
.Property(t => t.TagText )
.HasMaxLength(128)
.IsRequired()
.HasUniqueIndexAnnotation("UI_UserGroupTagtext", 2);
modelBuilder.Entity<UserTag>
.Property(t => t.UserGroupId)
.HasUniqueIndexAnnotation("UI_UserGroupTagtext", 1);