c# - Entity Framework Core 3.0 中的自有类型问题

标签 c# entity-framework asp.net-core .net-core

我有 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 核心身份)和 AspNetUsers1SMSCodeInfo 组成的表格成员。 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/

相关文章:

docker - Start.Process() .net Core 在 Linux Docker 中不起作用

c# - 是否可以在不使用路由器的情况下添加 Blazor WebAssembly 并将其放入现有的 ASP.NET Core 网站中?

c# - 查询选项无法应用于请求的资源

docker - 使用Docker在Windows容器上的时间偏移了两个小时

c# - 带有 Entity Framework 的 Catchall 表

c# - 如何为脚手架注册自定义 EF Code First 迁移操作?

c# - 在 Azure Web 应用设置中使用数组

c# - 尝试反序列化 xml 文件时出现异常

c# - 如何优雅地编写锁{}?

c# - 无法在 web-api 2 中创建新用户