简体   繁体   English

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

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

I want to create an 1:n relationship, based on the naming conventions for creating relationships, with the Entity Framework. 我想基于创建关系的命名约定 ,使用Entity Framework创建1:n关系。 I'm using codefirst. 我正在使用codefirst。 Entity Framework ignores the conventions and alwas creates two foreign key columns, instead of only one: 实体框架忽略了约定,并且alwas创建了两个外键列,而不是只创建一个:

  • StreamWorkerUser_Id (i want only this column) StreamWorkerUser_Id(我只想要这个列)
  • StreamWorkerUser_Id1 StreamWorkerUser_Id1

The configuration class is configured like following: 配置类配置如下:

AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;

I'm using the Microsoft.Identity Framework, with custom classes for all models. 我正在使用Microsoft.Identity Framework,其中包含所有模型的自定义类。

My DbContext class is as simple as following. 我的DbContext类就像下面这么简单。

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

The Task model: Task模型:

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

The StreamWorkerUser model: StreamWorkerUser模型:

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

The Task class inherits from this base type, here are also two properties of type StreamWorkerUser defined (But these columns generated correctly in the database.): 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; }
}

Is it possible that, the properties Creator and LastEditor disturbing the database migration? CreatorLastEditor属性是否有可能扰乱数据库迁移?

Do i understand the conventions correctly? 我是否正确理解惯例?

Much more information: 更多信息:

  • Entity Framework Version 6.1.3 实体框架版本6.1.3
  • Microsoft.AspNet.Identity.Core 2.2.1 Microsoft.AspNet.Identity.Core 2.2.1
  • Microsoft.AspNet.Identity.EntityFramework 2.2.1 Microsoft.AspNet.Identity.EntityFramework 2.2.1
  • ASP.NET 4 MVC 5 ASP.NET 4 MVC 5
  • SQL Server in Azure Cloud Azure云中的SQL Server
  • C# 6.0 C#6.0
  • .NET Framework 4.5.2 .NET Framework 4.5.2
  • All of this code is in a class libary 所有这些代码都在类库中

So you might think that EF in this situation: 所以在这种情况下你可能会认为EF:

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

will create creator_id and lasteditor_id, but it doesn't, because EF took class name and made StreamWorkerUser_Id, and StreamWorkerUser_Id1, because there were StreamWorkerUser_Id already used. 将创建creator_id和lasteditor_id,但它没有,因为EF取了类名并制作了StreamWorkerUser_Id和StreamWorkerUser_Id1,因为已经使用了StreamWorkerUser_Id。 By default, if you make relation by class(not by int field), EF generates its column name depending on the class name(not by field name). 默认情况下,如果按类(而不是int字段)创建关系,则EF会根据类名(而不是字段名称)生成其列名。

If you want to specify column names for those FK you can do : 如果要为这些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.

相关问题 在实体框架中创建Code First 1:1关系会导致两个外键字段 - Creating Code First 1:1 relationship in entity framework results in two foreign key fields 实体框架6首先将多个表与一个外键关系代码 - Entity Framework 6 multiple table to one foreign key relationship code first 实体框架 - 代码优先 - 数据注释 - 不必要的外键列 - Entity Framework - Code first - Data annotations - Unnecessary foreign key columns 使用Entity Framework Code First时创建外键属性有什么意义? - What is the point of creating foreign key properties when using Entity Framework Code First? 代码优先实体框架中两种外键方法之间的区别 - Difference between two foreign key approaches in code first Entity Framework 以n:n关系更新外键-实体框架代码优先迁移 - Update foreign keys in an n:n relationship - Entity Framework Code First Migrations 使用子类时,实体框架(代码优先)为同一属性创建两个外键字段 - Entity Framework (code first) creates two foreign key fields for the same property when using subclasses 首先使用实体​​框架代码时将外键设置为空 - Setting a foreign key to null when using entity framework code first 实体框架6代码优先,复合外键 - Entity Framework 6 Code First, Composite Foreign Key 实体框架代码第一个外键问题 - Entity Framework Code First Foreign Key issue
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM