【问题标题】:EF Code-First Add Unique Index to ColumnEF Code-First 向列添加唯一索引
【发布时间】:2015-07-01 16:52:21
【问题描述】:

在我的实体框架代码优先模型中,我有一个表,它需要一列才能具有唯一值。我想对其应用唯一索引,因为我看到它在 EF 6.1 中非常容易

public partial class User
{
   public int Id { get; set; }

   [Index(IsUnique = true)]
   public virtual SharePoint SharePoint { get; set; }
}

在为此代码创建迁移时,将生成以下内容:

public override void Up()
{
    CreateTable(
        "dbo.Users",
        c => new
            {
                Id = c.Int(nullable: false, identity: true),
                SharePoint_Id = c.Int(nullable: false),
            })
        .PrimaryKey(t => t.Id)
        .ForeignKey("dbo.SharePoints", t => t.SharePoint_Id)
        .Index(t => t.SharePoint_Id);
}

如您所见,索引在此处不是唯一的。

数据库索引也表明创建的索引不是唯一的

我在旧版本的 EF 中看到您必须通过模型生成器执行此操作,我也尝试过:

modelBuilder.Entity<Configuration>()
    .Property(p => p.SharePoint)
    .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = true }));

这可悲地导致错误:

类型“kData.Sharepoint”必须是不可为空的值类型,才能在泛型类型或方法“System.Data.Entity.ModelConfiguration.Configuration.StructuralTypeConfiguration.Property(系统.Linq.Expressions.Expression>)

那么如何创建代码优先迁移,在 EF 6.1 中向列添加唯一索引?

【问题讨论】:

标签: c# entity-framework indexing entity-framework-6 unique


【解决方案1】:

这可能是因为您在数据库中不存在的导航属性上指定唯一约束,而是数据库中存在外键,因此您可以尝试将属性应用于外键 SharePoint_Id 并使其不可为空,然后应该可以。

modelBuilder.Entity<User>()
.Property(p => p.SharePoint_Id)
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsUnique = true }));

【讨论】:

  • 感谢您的回答。我曾经使 SharePoint 成为对象和虚拟对象,因为它存在于另一个表中(是它的外键)。所以SharePoint_Id 将由EF 在内部访问,它会从我的另一个表中加载整个对象,而不是在这里给我一个ID,我想。我无法指定SharePoint_Id。它在我的 EF C# 模型中不可用:(
  • @Vizenz 你可以指定外键名。在 DataAnnotation 库中定义了 ForeignKeyAttribute 属性用于此类用途,或者您可以使用 HasForeignKey 方法以防您使用流利的 api。
  • 我担心我不得不这样做......遗憾的是 Entity Framework 还没有功能来检测这种情况
猜你喜欢
  • 1970-01-01
  • 2012-01-05
  • 2017-01-11
  • 2020-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多