[英]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.