簡體   English   中英

Entity Framework Core 3.0中的擁有類型問題

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM