【问题标题】:EF Code First Foreign key must be mapped to some AssociationSet or EntitySets participating in a foreign key association on the conceptual sideEF Code First外键必须映射到一些在概念方面参与外键关联的AssociationSet或EntitySet
【发布时间】:2015-10-30 16:08:21
【问题描述】:

我们希望将我们的项目从 Database-First 迁移到 Code-First。 对于这个任务,我使用了来自 Visual Studio 的数据库生成器的 Code First。 我有一些带有串联 PK 和 FK 的表。 我无法将它们更改为一个简单的“ID”,因为有一个遗留应用程序需要它们。 EF版本是6.1.3

当我启动我的程序时,我收到以下错误:

(1568,10):错误 3015:从行开始映射片段时出现问题 1568、1583:外键约束 'tblRechnungPosition_tblAngebReches' 来自表 tblAngebRech (RechNr, RechPosNr, CompanyID) 到表 tblRechnungPosition (RechNr, CompanyID, PosNr):: Insufficient mapping: 外键必须映射到某个 参与外键的关联集或实体集 概念方面的关联。

我无法弄清楚是什么导致了错误,对我来说所有的关系似乎都是正确的。

以下是课程:

public partial class tblAngebRech
{
    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int AngebotID { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int AngebPosNr { get; set; }

    [Key]
    [Column(Order = 2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int RechNr { get; set; }

    [Key]
    [Column(Order = 3)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int RechPosNr { get; set; }

    [Key]
    [Column(Order = 4)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CompanyID { get; set; }

    public DateTime Timestamp { get; set; }

    public virtual tblAngebotPosition tblAngebotPosition { get; set; }

    public virtual tblRechnungPosition tblRechnungPosition { get; set; }
}

.

public partial class tblRechnungPosition
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public tblRechnungPosition()
    {
        tblAngebReches = new HashSet<tblAngebRech>();
        tblBeauftReches = new HashSet<tblBeauftRech>();
        tblRechPosMitarbs = new HashSet<tblRechPosMitarb>();
    }

    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int RechNr { get; set; }

    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CompanyID { get; set; }

    [Key]
    [Column(Order = 2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int PosNr { get; set; }

    public int PosTypID { get; set; }

    public int? StdKeyID { get; set; }

    public double Menge { get; set; }

    public double Betrag { get; set; }

    [Required]
    [StringLength(100)]
    public string Bezeichnung { get; set; }

    public DateTime Timestamp { get; set; }

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

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

    public virtual tblPositionstyp tblPositionstyp { get; set; }

    public virtual tblRechnung tblRechnung { get; set; }

    public virtual tblStundenKey tblStundenKey { get; set; }

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

这是来自protected override void OnModelCreating(DbModelBuilder modelBuilder)

modelBuilder.Entity<tblRechnungPosition>()
    .HasMany(e => e.tblAngebReches)
    .WithRequired(e => e.tblRechnungPosition)
    .HasForeignKey(e => new { e.RechNr, e.CompanyID, e.RechPosNr });

任何帮助将不胜感激。

【问题讨论】:

    标签: c# entity-framework ef-code-first entity-framework-6 code-first


    【解决方案1】:

    尝试手动调整模型构建器中外键属性的顺序:

    modelBuilder.Entity<tblRechnungPosition>()
    .HasMany(e => e.tblAngebReches)
    .WithRequired(e => e.tblRechnungPosition)
    .HasForeignKey(e => new { e.RechNr, e.RechPosNr, e.CompanyID });
    

    我向 codeplex 的 EF 6.x 团队发送了一个错误问题。 这是链接:https://entityframework.codeplex.com/workitem/2947

    如果这不起作用。尝试将 tblRechnungPosition 类中 Column 属性的 Order Number 更改为:

    [Key]
    [Column(Order = 0)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int RechNr { get; set; }
    
    [Key]
    [Column(Order = 2)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int CompanyID { get; set; }
    
    [Key]
    [Column(Order = 1)]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int PosNr { get; set; }
    

    注意:您有复合外键。在两个表类中,[Columns(Order = &lt;order number&gt;)] 内的属性顺序必须相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多