我有EF Core 3.0 preview4的奇怪行为。我有主要课程:
public enum ClientType
{
Customer = 0,
Produces = 1,
}
public class User : IdentityUser<Guid>
{
public ClientType ClientType { get; set; }
public SMSCodeInfo SMSCodeInfo { get; set; }
public string Discriminator { get; set; }
}
在此代码中,SMSCodeInfo是一个类:
public class SMSCodeInfo
{
public long Code { get; set; }
public DateTime Expiration { get; set; }
public SMSCodeInfo() { }
public SMSCodeInfo(int days, int hours, int minutes) : this(DateTime.Now.AddDays(days).AddHours(hours).AddMinutes(minutes)) { }
public SMSCodeInfo(DateTime Expiration)
{
this.Expiration = Expiration;
Code = new Random().Next(100000, 999999);
}
}
我尝试通过不同的方法将SMSCodeInfo
作为拥有的数据添加到User
类中:[Owned]
属性用法,在OnModelCreating(ModelBuilder modelBuilder)
方法中添加代码:
modelBuilder.Entity<User>().OwnsOne(o => o.SMSCodeInfo);
但每次我进行迁移时,我都得到2个表:AspNetUsers
,其中包含有关用户的身份信息(我在项目中使用Asp.net核心身份),以及由AspNetUsers1
成员组成的SMSCodeInfo
表。 EF Core为迁移生成此代码,我无法理解“为什么”!
migrationBuilder.CreateTable(
name: "AspNetUsers1",
columns: table => new
{
UserId = table.Column<Guid>(nullable: false),
Code = table.Column<long>(nullable: false),
Expiration = table.Column<DateTime>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_AspNetUsers1", x => x.UserId);
table.ForeignKey(
name: "FK_AspNetUsers1_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});
“额外”。我希望将所拥有的数据添加到AspNetUser表中,而不是添加到单独的表中。
附:这个问题出现在从IdentityUser <>派生的类中。对于像我这样的项目代码中的其他类,modelBuilder.Entity<TOwner>().OwnsOne(o => o.ToBeOwned);
工作正确,并提供带有注入的自有类型的正确表。
根据Owned Entity Types in EF Core的说法,modelBuilder.Entity<User>().OwnsOne(o => o.SMSCodeInfo);
应该在[Owned]
表中创建Owner
实体列,但是很难创建一个名为AspNetUsers1
的单独表格。
如果您希望[Owned]
实体列应位于单独的表中,那么您的配置应如下所示:
modelBuilder.Entity<User>().OwnsOne(o => o.SMSCodeInfo , sm =>
{
sm.ToTable("SMSCodeInfo");
});
它将生成如下:
migrationBuilder.CreateTable(
name: "SMSCodeInfo",
columns: table => new
{
UserId = table.Column<Guid>(nullable: false),
Code = table.Column<long>(nullable: false),
Expiration = table.Column<DateTime>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_SMSCodeInfo", x => x.UserId);
table.ForeignKey(
name: "FK_SMSCodeInfo_AspNetUsers_UserId",
column: x => x.UserId,
principalTable: "AspNetUsers",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
});