Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ef代码带导航属性的第一个索引,不添加Id_C#_Entity Framework_Entity Framework Migrations_Ef Fluent Api - Fatal编程技术网

C# Ef代码带导航属性的第一个索引,不添加Id

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

我有一个名为UserTag的EF代码第一类

UserTag具有以下两个属性

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);