我正在做一个项目/教程,我有两个与所讨论的迁移相关的类。首先在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并加入一个连接,所以我不确定他们为什么这样做,或者有什么好处。
答案 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; }
}