您能解释为什么实体框架这样做吗?

时间:2020-07-09 00:25:01

标签: .net entity-framework

我正在做一个项目/教程,我有两个与所讨论的迁移相关的类。首先在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。您还将如何在表中使用它来表示对象。通常,我只使用id并加入一个连接,所以我不确定他们为什么这样做,或者有什么好处。

1 个答案:

答案 0 :(得分:0)

您正在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; }  
}
相关问题