Entity Framework Core 3.0中的拥有类型问题

问题描述 投票:1回答:1

我有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);工作正确,并提供带有注入的自有类型的正确表。

c# entity-framework asp.net-core .net-core
1个回答
2
投票

根据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);
            });
© www.soinside.com 2019 - 2024. All rights reserved.