【问题标题】:In Entity Framework Core 1.0 how do you rename indexes?在 Entity Framework Core 1.0 中如何重命名索引?
【发布时间】:2016-01-26 01:59:15
【问题描述】:

到目前为止,我已经允许 EF 为我的项目自动生成索引和键名,但不幸的是我开始在一种情况下达到字符限制。基本上我有两个带有聚集键(4 列)的表,需要在它们之间创建一个查找表。一旦我这样做了,我就会得到错误:

"The identifier that starts with [Long FK Name Here] is too long. Maximum length is 128.

最好在 Fluent API 中,如何在 Entity Framework 7 中手动命名外键索引,使其不是 FK_table2_table1_table1ID?例如,在下面的简单示例中,我如何将租户表 FK_tbl_Person_tbl_Tenant_TenantID 中的 FK 重命名为 FK_Tenant?

【问题讨论】:

  • 你使用的是什么版本的EntityFramework?
  • Entity Framework 7 但 6 中的大部分东西似乎都可以工作..
  • 不重复 EF Core 有完全不同的 API。
  • @emrenevayeshirazi 对不起,你是对的。 ef.readthedocs.org/en/latest/modeling/indexes.html#fluent-api
  • 不幸的是,该链接没有帮助 - 我已经为其他实体这样做了,它确实创建了一个索引。我知道如何创建索引 - 我希望能够更改自动生成的索引名称的名称

标签: c# entity-framework entity-framework-core


【解决方案1】:

我已经使用本教程使用 VS2015 安装 EF:

EF - Console Application to New Database

基本上:

  • 确保您的目标是 .NET Framework 4.5.1 或更高版本。
  • 确保您使用的是最新版本的nuget package manager
  • 安装这两个包:
    • EntityFramework.MicrosoftSqlServer –Pre
    • EntityFramework.Commands –Pre

我创建了一个包含两个实体的简单 DbContext:

using Microsoft.Data.Entity;
using System.Collections.Generic;
public class SampleContext : DbContext
{
    public DbSet<Person> People { get; set; }

    public DbSet<Tenant> Tenants { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        // Visual Studio 2015 | Use the LocalDb 12 instance created by Visual Studio
        optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;");

        // Visual Studio 2013 | Use the LocalDb 11 instance created by Visual Studio
        // optionsBuilder.UseSqlServer(@"Server=(localdb)\v11.0;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;");
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        // Configure the name of the foreign key
        modelBuilder.Entity<Person>()
            .HasOne(p => p.Tenant)
            .WithMany(t => t.Persons)
            .HasConstraintName("MyForeignKey");

        // Configure the name of a unique index
        modelBuilder.Entity<Person>().HasAlternateKey(p => p.Email).ForSqlServerHasName("MyUniqueEmail");

    }
}

public class Person
{
    public int PersonId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual Tenant Tenant { get; set; }
}

public class Tenant
{
    public Tenant()
    {
        Persons = new HashSet<Person>();
    }

    public int TenantId { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Person> Persons { get; set; }
}

所以要配置外键的名字:

modelBuilder.Entity<Person>()
            .HasOne(p => p.Tenant)
            .WithMany(t => t.Persons)
            .HasConstraintName("MyForeignKey");

配置唯一索引的名称:

modelBuilder.Entity<Person>().HasAlternateKey(p => p.Email).ForSqlServerHasName("MyUniqueEmail");

然后您需要使用包管理器控制台为您的上下文创建迁移:

  • 添加迁移 MyFirstMigration

最后使用包管理器控制台更新您的数据库:

  • 更新数据库

使用 Sql Server Management Studio,我可以检查我的索引名称:

【讨论】:

    猜你喜欢
    • 2021-02-04
    • 1970-01-01
    • 2016-05-14
    • 2017-03-14
    • 1970-01-01
    • 2017-04-21
    • 2016-12-21
    • 1970-01-01
    • 2018-09-22
    相关资源
    最近更新 更多