Как изменить имя столбца поля FK Id? - PullRequest
0 голосов
/ 25 апреля 2018

В моей модели я имею отношение 2 ко многим к одной и той же таблице.Вот так:

public class BpsModel {
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Person> Reviewers { get; set; }
    public List<Person> Modelers { get; set; }
}

public class Person
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
}

Когда я запускаю миграции, это структура базы данных Person:

migrationBuilder.CreateTable(
    name: "Persons",
    columns: table => new
    {
        Id = table.Column<int>(nullable: false)
            .Annotation("Sqlite:Autoincrement", true),
        BpsModelId = table.Column<int>(nullable: true),
        BpsModelId1 = table.Column<int>(nullable: true),
        Email = table.Column<string>(nullable: true),
        Name = table.Column<string>(nullable: true)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_Persons", x => x.Id);
        table.ForeignKey(
            name: "FK_Persons_BpsRecords_BpsModelId",
            column: x => x.BpsModelId,
            principalTable: "BpsRecords",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
        table.ForeignKey(
            name: "FK_Persons_BpsRecords_BpsModelId1",
            column: x => x.BpsModelId1,
            principalTable: "BpsRecords",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    });

Как видите, таблица Person имеет два столбца с очень похожимиимена: BpsModelId и BpsModelId1.Это бесполезно, так как теперь мне нужно копать, кто из них является Modeler, а кто рецензентом.Есть ли способ изменить имя столбца на что-то вроде ReviewerBpsModelId и ModelerBpsModelId?

Спасибо

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

В вашем OnModelCreating методе вы должны установить его, используя свободную конфигурацию, как показано ниже:

modelBuilder.Entity<BpsModel>()
            .HasMany(p => p.Reviewers)
            .WithOne()
            .HasForeignKey("BpsModelReviewerId"); // <- You customize the foreign key name for Reviewers association

modelBuilder.Entity<BpsModel>()
            .HasMany(p => p.Modelers)
            .WithOne()
            .HasForeignKey("BpsModelModelerId"); // <- You customize the foreign key name for Modelers association
0 голосов
/ 25 апреля 2018

Это происходит потому, что вам нужны два поля Int, одно для хранения кода Modeler, а другое для Reviewer, проблема в том, что на эти два ключа ссылается одна и та же таблица.так же, чтобы решить проблему.

внешний ключ для Reviewer

[ForeignKey("ReviewerId")]
public int ReviewerId { get; set; }
public Person Reviewers { get; set; }

внешний ключ для Modeler

[ForeignKey("ModelerId")]
public int ModelerId { get; set; }
public Person Modelers { get; set; }

ваш класс будет выглядеть так

public class BpsModel {
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    [ForeignKey("ReviewerId")]
    public int ReviewerId { get; set; }
    public Person Reviewers { get; set; }

    [ForeignKey("ModelerId")]
    public int ModelerId { get; set; }
    public Person Modelers { get; set; }
}

public class Person
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }

   public ICollection<BpsModel> BpsModel{ get; set; }
}

добавьте использование:

using System.ComponentModel.DataAnnotations.Schema;

Запустите Add-Migrations, это работа в моих проектах!

0 голосов
/ 25 апреля 2018

Если вы хотите, чтобы [KEY] имел определенное имя в базе данных, вы можете использовать DataAnnotations в своем классе модели для настройки имени столбца SQL Server.Это называется Отображение столбцов

Так что вы можете сделать:

public class BpsModel {
    [Key]
    [Column("my_custom_column_name")]
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Person> Reviewers { get; set; }
    public List<Person> Modelers { get; set; }
}
...