Подтвердить что ты не робот

Как указать имя первичного ключа в EF-Code-First

Я использую Entity Framework Codefirst для создания моей базы данных. Основной ключ по умолчанию с именем схемы dbo.pk_Jobs, похоже, нарушает доступ к 2007 году, когда я подключаюсь к нему через ODBC. Если я вручную отредактирую имя и удалю имя схемы и переименую этот первичный ключ в pk_jobs, Access теперь сможет прочитать таблицу.

Можно ли указать имя основного ключа, чтобы не включать имя схемы с использованием Fluent Api, атрибутов данных или любого другого метода.

public class ReportsContext : DbContext
{
    public DbSet<Job> Jobs { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Job>().ToTable("Jobs");
        modelBuilder.Entity<Job>().HasKey(j => j.uuid);

        base.OnModelCreating(modelBuilder);
    }
}
public class Job
{
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}
4b9b3361

Ответ 1

Если вы хотите указать имя столбца и переопределить имя свойства, вы можете попробовать следующее:

Использование аннотаций

public class Job
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Column("CustomIdName")]
    public Guid uuid { get; set; }
    public int active { get; set; }
}

Использование первого кода

    protected override void OnModelCreating(DbModelBuilder mb)
    {
        base.OnModelCreating(mb);

        mb.Entity<Job>()
            .HasKey(i => i.uuid);
        mb.Entity<Job>()
          .Property(i => i.uuid)
          .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
          .HasColumnName("CustomIdName");
    }

Конфигурация внутренней миграции

public partial class ChangePrimaryKey : DbMigration
{
    public override void Up()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.IndexName', 'New_IndexName', 'INDEX'");
    }

    public override void Down()
    {
        Sql(@"exec sp_rename 'SchemaName.TableName.New_IndexName', 'Old_IndexName', 'INDEX'");
    }
}

Ответ 2

Вы можете использовать атрибут Key, чтобы указать части первичного ключа. Таким образом, ваш класс Job может быть

public class Job
{
    [Key]
    public Guid uuid{ get; set; }
    public int active{ get; set; }
}

Атрибуты аннотации данных определены в пространстве имен System.ComponentModel.DataAnnotations

Ответ 3

Если я понимаю, вы спрашиваете, как изменить имя столбца первичного ключа, используемого Entity Framework. Следующее дополнение к вашему заявлению HasKey должно позаботиться об этом:

modelBuilder.Entity<Job>().Property(j => j.uuid).HasColumnName("pk_Jobs")

Ответ 4

(Это дополнение к ответам/комментариям @Jeff Sivers и @cubski.)

Насколько я знаю, вы не можете указать имя PK с атрибутом данных. Иногда мне нужно избавиться от части dbo. имени, и затем я использую вручную отредактированный код для первой миграции, чтобы изменить имя, например:

public partial class ChangeNameOnPKInCustomers : DbMigration
{
    private static string fromName = "PK_dbo.Customers";    // Name to change

    private static string toName = fromName.Replace("dbo.", "");

    public override void Up()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{fromName}]', @newname=N'{toName}'");
        // Now the PK name is "PK_Customers".
    }

    public override void Down()
    {
        Sql($"exec sp_rename @objname=N'[dbo].[{toName}]', @newname=N'{fromName}'");
        // Back to "PK_dbo.Customers".
    }
}

Ответ 5

При добавлении явной миграции с использованием кода First вы получите файл .cs с именем миграции, который является частичным классом с базовым классом DbMigration.

Для ограничения основного ключа у вас есть функция DropPrimaryKey или AddPrimaryKey в зависимости от того, что вы пытаетесь сделать. Моя проблема была в DropPrimaryKey, так как у моего Db было другое имя для основного ключа.

Обе эти функции имеют перегрузки, чтобы взять имя PK, чтобы вы могли явно указать имя PK. Работала отлично для меня для DropPrimaryKey с явным именем PK. Аргументом является объект anonymousArguments, который по умолчанию имеет значение null.