繁体   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