2

我想基于命名约定创建与实体框架的关系的1:n关系。我正在使用codefirst。实体框架忽略的公约和alwas创建两个外键列,而不是只有一个:实体框架代码在创建1:n关系时,首先在数据库中生成两个外键列

  • 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在碧霞
  • C#6.0
  • .NET 4 MVC 5
  • SQL服务器.NET框架4.5.2
  • 所有这些代码是一类libary
+0

你怎么又希望存储关系Creator和LastEditor如果你只想要一个外键? – faint220

+0

@ faint220我不想只有一个外键。应该有三个。一个用于'Creator',一个用于'LastEditor',一个用于'StreamWorkerUser'。目前有4个列生成:Creator_Id,LastEditor_Id,StreamWorkerUser_Id,StreamWorkerUser_Id1。 –

+0

您是否尝试过实体类型配置?你可以明确地声明外键使用流利的API – Efe

回答

0

所以,你可能会认为,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; } 
+0

谢谢你的回答,但在我的情况下,columnames是从字段名生成的。请参阅问题下的评论。 –

相关问题