EF在进行不存在的数据库事务时自动生成外键字段

时间:2019-06-23 08:38:12

标签: c# entity-framework entity-framework-6

我正在一个项目中,我们使用实体框架进行数据库事务。 在进行数据库事务时,如果特定表中有任何引用键,那么它将自动为该引用实体自动生成新字段,甚至不存在。

例如:

  

我有一个名为 Stations 的表,该表的引用为   StationTypes (一对一)。

     

现在,每当我们尝试在Stations表中创建/更新任何记录时,它   通过defaylt注入一个称为“ StationType_Id”的字段到特定   名为“ StationType_Id”的查询-甚至不存在并且最终出现在   引发波纹管错误。

Invalid column name 'StationTypes_Id'.

EF生成的示例数据库实体

public partial class Stations
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Stations()
    {
        this.OrganizationStations = new HashSet<OrganizationStations>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public int StationTypeId { get; set; }
    public int Status { get; set; }
    public int CreatedBy { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public Nullable<int> UpdatedBy { get; set; }
    public Nullable<System.DateTime> UpdatedDate { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<OrganizationStations> OrganizationStations { get; set; }
    public virtual StationTypes StationTypes { get; set; }
}

1 个答案:

答案 0 :(得分:0)

这看起来实际上是多对一关系。一个站点有1个站点类型,但是许多站点可能具有相同的站点类型。

在这种情况下,可以预料到Station记录将具有StationTypeId列。您可能不希望在Station实体中公开StationTypeId属性,以便在EF 6中进行映射:

使用modelBuilder

modelBuilder.Entity<Station>
   .HasRequired(x => x.StationType)
   .WithMany()
   .Map(x => x.MapKey("StationTypeId"));

一对一关系会使StationType表与Station表共享一个StationId PK。在这种情况下,Station会引用StationType,StationType会引用Station。然后,EF将通过PK将这些链接在一起:

modelBuilder.Entity<Station>
   .HasRequired(x => x.StationType)
   .WithRequired(x => x.Station);

可以设置FK与FK的关系,但是一个FK必须为空。