我有 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);
工作正常,并提供正确的表格,其中包含注入(inject)的自有类型。
最佳答案
根据 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);
});
关于c# - Entity Framework Core 3.0 中的自有类型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55903273/