Вы можете объяснить, почему Entity Framework это делает? - PullRequest
0 голосов
/ 09 июля 2020

Я делал проект / учебник, и у меня есть два класса, которые связаны с рассматриваемой миграцией. Сначала в классе Customer, а затем в классе MembershipType.

public class Customer
{
    public int Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public bool IsSubcribedToNewsletter { get; set; }
    public MembershipType MembershipType { get; set; }
    public byte MembershipTypeId { get; set; }
}

public class MembershipType
{
    public int Id { get; set; }
    public short SignUpFee { get; set; }
    public byte DurationInMonths { get; set; }
    public byte DiscountRate { get; set; }
}

Когда я выполняю миграцию, он создает это

 migrationBuilder.CreateTable(
            name: "Customers",
            columns: table => new
            {
                Id = table.Column<int>(nullable: false)
                    .Annotation("SqlServer:Identity", "1, 1"),
                Name = table.Column<string>(maxLength: 255, nullable: false),
                IsSubcribedToNewsletter = table.Column<bool>(nullable: false),
                MembershipTypeId1 = table.Column<int>(nullable: true),
                MembershipTypeId = table.Column<byte>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Customers", x => x.Id);
                table.ForeignKey(
                    name: "FK_Customers_MembershipTypes_MembershipTypeId1",
                    column: x => x.MembershipTypeId1,
                    principalTable: "MembershipTypes",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
            });

        migrationBuilder.CreateIndex(
            name: "IX_Customers_MembershipTypeId1",
            table: "Customers",
            column: "MembershipTypeId1");
    }

Откуда MembershipTypeId1?

Я следил за инструкцией, и это вообще не объясняется. Я также использую новую версию. NET, поэтому мне еще труднее выяснить, почему и как исправить это на основе того, что я вижу.

MembershipTypeId1 должно представлять объект MembershipType из другого класса. Я думаю, что это проблема, но я не уверен, почему он конвертирует его в MembershipTypeId1. Также как бы вы использовали это в таблице для представления объекта. Обычно я просто использую идентификатор и выполняю соединение, поэтому я не уверен, почему они делают это таким образом, и в чем выгода.

1 Ответ

0 голосов
/ 09 июля 2020

Вы используете byte MembershipTypeId в своем классе Customer, предположительно как столбец внешнего ключа:

public class Customer
{
    public int Id { get; set; }
    .....
    public byte MembershipTypeId { get; set; }
           ****
}

К сожалению, тип данных не соответствует первичному ключу MembershipType, который определяется как int:

public class MembershipType
{
    public int Id { get; set; }
           ***
    ....
}

Следовательно, EF представит собственный сгенерированный столбец FK MembershipType1 с правильным типом данных.

Я почти уверен, что вы исправите этот «недостаток» ; тогда EF больше не будет создавать свой отдельный столбец MembershipType1, но вместо этого будет использовать ваш столбец MembershipType:

public class Customer
{
    public int Id { get; set; }
    [Required]
    [StringLength(255)]
    public string Name { get; set; }
    public bool IsSubcribedToNewsletter { get; set; }
    public MembershipType MembershipType { get; set; }
    // make it "INT", since PK on MembershipType is INT        
    public int MembershipTypeId { get; set; }  
}
...