[英]Owned types problem in Entity Framework Core 3.0
我有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表中,而不是在单独的表中。
PS对于从IdentityUser <>派生的类,会出现此问题。 对于我的项目代码中的其他类,例如: modelBuilder.Entity<TOwner>().OwnsOne(o => o.ToBeOwned);
可以正常工作,并提供具有注入的拥有类型的正确表。
根据EF Core中的拥有实体类型 , modelBuilder.Entity<User>().OwnsOne(o => o.SMSCodeInfo);
应该在Owner
表中创建[Owned]
实体列,但应将其稳定地创建到一个单独的表中,并使用一个奇怪的名称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);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.