Entity framework 实体框架生成的列名

Entity framework 实体框架生成的列名,entity-framework,ef-code-first,entity-framework-6,Entity Framework,Ef Code First,Entity Framework 6,我有一个作业实体,它有两个相同类型的集合 public virtual ICollection<Device> ExistingDevices { get; set; } public virtual ICollection<Device> NewDevices { get; set; } 从表面上看,这很好,但是在数据库上,如果你看一个设备,你会看到这个 //Devices Table in Db |JobId | Job_Id | Job_Id1

我有一个
作业
实体,它有两个相同类型的集合

    public virtual ICollection<Device> ExistingDevices { get; set; }
    public virtual ICollection<Device> NewDevices { get; set; }
从表面上看,这很好,但是在数据库上,如果你看一个设备,你会看到这个

//Devices Table in Db

|JobId |  Job_Id | Job_Id1 |
我的设置包括用于使用fluent API的实体配置对象,但是我还没有找到解决方法。第一个JobId很好,它是对数据的完美描述。后两个是指它们所属的
现有设备
新设备
列表。标题完全不是描述性的

是否可以将这些列重命名为更合适的名称

//编辑

它有FK
JobId
,但是如果设备在ExistingDevices列表中,那么JobId也会被放入
Job\u Id
,并且
Job\u Id1
为空。如果设备属于NewDevices列表,则
作业Id
为空,并且
作业Id 1
中包含作业Id

将Job_id命名为ExistingDevices,将Job_id命名为NewDevices将使数据库中的内容更加清晰

更新

睡过觉后,我认为这是设计上的错误

我将
设备
型号更改为

public bool NewDevice { get; set; }
并通过删除2个现有ICollection并添加

public virtual ICollection<Device> Devices { get; set; }
公共虚拟ICollection设备{get;set;}

我现在没有两个设备集合,而是有一个,带有适当的描述性FK。在数据库中,1或0将表示新的或现有的设备。

如果有两个一对多关系,则数据库将在从属实体(
设备
)上有两个外键列
JobId
可能表示
ExistingDevices
JobId1
可能表示
NewDevices

为了清楚起见,您应该定义两个导航属性,如下所示

public int? ExistingJobId { get; set; }
public virtual Job ExistingJob { get; set; } 
public int? NewJobId { get; set; }
public virtual Job NewJob { get; set; } 
然后可以使用配置关系

模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.has可选(x=>x.ExistingJob)
.有许多(x=>x.现有设备)
.HasForeignKey(x=>x.ExistingJobId);
.WillCascadeOnDelete(真);
modelBuilder.Entity()
.has可选(x=>x.NewJob)
.WithMany(x=>x.NewDevices)
.HasForeignKey(x=>x.NewJobId)
.WillCascadeOnDelete(假);
}
注意,定义一个外键时没有级联删除(
false
),因为这是不允许的


更新:所需的现有作业和新作业已更改为可选作业。

依赖项是设备。创建作业时,可以有“现有设备”和/或“新设备”的列表,但它们是可选的。
设备
表中有3个对JobId的引用,如前所述,一个用于FK对作业记录的引用,另两个与它们所属的列表相关。我不希望设备上有三个作业导航属性,因为它应该只与一个作业相关。@詹姆斯,我打错了依赖项,它应该是设备,在你的问题中,你有两列
JobId
,是可能的还是你打错了?@James,如果你必须对主体进行多重运算,并且只与一个作业相关,这是不可能的,除非您使用“每个层次的表映射”来引入继承,否则我在最初的问题中已经尝试过详细说明。希望它更有意义。“我的列名输入错误是正确的。@James,每个关系都代表数据库中的一个FK,第一个多重数按惯例在主体
现有设备
中找到,它将搜索依赖项上的引用以确定FK是否为必需/可选,第二个多重性在主体
NewDevices
上找到,但EF在依赖项中找不到,EF仍将创建FK,它将成为可选的,我认为第二个
Job\u Id
和第三个
Job\u Id1
是实际的外键,因为依赖项导航属性不适合
public int? ExistingJobId { get; set; }
public virtual Job ExistingJob { get; set; } 
public int? NewJobId { get; set; }
public virtual Job NewJob { get; set; } 
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Device>()
        .HasOptional(x => x.ExistingJob)
        .WithMany(x => x.ExistingDevices)
        .HasForeignKey(x => x.ExistingJobId);
        .WillCascadeOnDelete(true);
    modelBuilder.Entity<Device>()
        .HasOptional(x => x.NewJob)
        .WithMany(x => x.NewDevices)
        .HasForeignKey(x => x.NewJobId)
        .WillCascadeOnDelete(false);
}