繁体   English   中英

实体框架代码首先在创建1:n关系时在数据库中生成两个外键列

[英]Entity Framework Code First generates two foreign key columns in database when creating a 1:n relationship

我想基于创建关系的命名约定 ,使用Entity Framework创建1:n关系。 我正在使用codefirst。 实体框架忽略了约定,并且alwas创建了两个外键列,而不是只创建一个:

  • StreamWorkerUser_Id(我只想要这个列)
  • StreamWorkerUser_Id1

配置类配置如下:

AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;

我正在使用Microsoft.Identity Framework,其中包含所有模型的自定义类。

我的DbContext类就像下面这么简单。

public class StreamWorkerDataContext : IdentityDbContext<StreamWorkerUser, StreamWorkerRole, int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim>
{
    public DbSet<Task> Tasks { get; set; }
}

Task模型:

public class Task : StreamWorkerEntity
{
    public StreamWorkerUser StreamWorkerUser { get; set; }
}

StreamWorkerUser模型:

public class StreamWorkerUser : IdentityUser<int, StreamWorkerUserLogin, StreamWorkerUserRole, StreamWorkerUserClaim>
    {
        public virtual List<Task> Tasks { get; set; } // also tested ICollection
    }

Task类继承自此基类型,这里还定义了StreamWorkerUser类型的两个属性(但这些列在数据库中正确生成。):

public class StreamWorkerEntity
{
    [Key]
    public int Id { get; set; }
    public DateTimeOffset Created { get; set; }
    public DateTimeOffset Updated { get; set; }
    public StreamWorkerUser Creator { get; set; }
    public StreamWorkerUser LastEditor { get; set; }
}

CreatorLastEditor属性是否有可能扰乱数据库迁移?

我是否正确理解惯例?

更多信息:

  • 实体框架版本6.1.3
  • Microsoft.AspNet.Identity.Core 2.2.1
  • Microsoft.AspNet.Identity.EntityFramework 2.2.1
  • ASP.NET 4 MVC 5
  • Azure云中的SQL Server
  • C#6.0
  • .NET Framework 4.5.2
  • 所有这些代码都在类库中

所以在这种情况下你可能会认为EF:

 public StreamWorkerUser Creator { get; set; }
 public StreamWorkerUser LastEditor { get; set; }

将创建creator_id和lasteditor_id,但它没有,因为EF取了类名并制作了StreamWorkerUser_Id和StreamWorkerUser_Id1,因为已经使用了StreamWorkerUser_Id。 默认情况下,如果按类(而不是int字段)创建关系,则EF会根据类名(而不是字段名称)生成其列名。

如果要为这些FK指定列名,您可以执行以下操作:

    public int CreatorId { get; set; } //this field name will be column name
    [ForeignKey("StreamWorkerUser")]
    public StreamWorkerUser Creator { get; set; }

    public int EditorId { get; set; } //this field name will also be column name
    [ForeignKey("StreamWorkerUser")]
    public StreamWorkerUser Editor { get; set; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM