C# 实体框架外键顺序错误

C# 实体框架外键顺序错误,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我已经设置了实体的键,如下所示 modelBuilder.Entity<SKU>().HasKey(p => new { p.DocEntry, p.Code }); modelBuilder.Entity<CUST>().HasKey(p => new { p.DocEntry, p.Code }); modelBuilder.Entity<Period>().HasKey(p => new { p.DocEntry

我已经设置了实体的键,如下所示

    modelBuilder.Entity<SKU>().HasKey(p => new { p.DocEntry, p.Code });
    modelBuilder.Entity<CUST>().HasKey(p => new { p.DocEntry, p.Code });
    modelBuilder.Entity<Period>().HasKey(p => new { p.DocEntry, p.Code });
    modelBuilder.Entity<FORECAST>().HasKey(p => new { p.DocEntry, p.Code });
modelBuilder.Entity().HasKey(p=>new{p.DocEntry,p.code});
modelBuilder.Entity().HasKey(p=>new{p.DocEntry,p.Code});
modelBuilder.Entity().HasKey(p=>new{p.DocEntry,p.Code});
modelBuilder.Entity().HasKey(p=>new{p.DocEntry,p.Code});
预测实体具有指向前3个实体的导航属性。定义如下

 modelBuilder.Entity<FORECAST>()
                 .HasRequired<SKU>(d => d.FTTSku)
                 .WithMany()
                 .HasForeignKey(k => new { k.DocEntry, k.SkuLineNum });

            modelBuilder.Entity<FORECAST>()
                  .HasRequired<CUST>(w => w.FTTCust)
                  .WithMany()
                  .HasForeignKey(k => new { k.DocEntry, k.CustLineNum });

            modelBuilder.Entity<FORECAST>()
                  .HasRequired<Period>(w => w.Period)
                  .WithMany()
                  .HasForeignKey(k => new { k.DocEntry, k.PeriodID });
modelBuilder.Entity()
.HasRequired(d=>d.FTTSku)
.有很多
.HasForeignKey(k=>new{k.DocEntry,k.SkuLineNum});
modelBuilder.Entity()
.has必需(w=>w.FTTCust)
.有很多
.HasForeignKey(k=>new{k.DocEntry,k.CustLineNum});
modelBuilder.Entity()
.has必需(w=>w.Period)
.有很多
.HasForeignKey(k=>new{k.DocEntry,k.PeriodID});
之后,当我试图从表中读取数据时,EF给出了以下错误

(6,10):错误3015:映射从第6行开始的片段时出现问题, 56:来自FORECAST表的外键约束“FORECAST\u Cust” (CustLineNum,DocEntry)到表CUST(DocEntry,Code)::不足 映射:外键必须映射到某个关联或 参与上的外键关联的EntitySet 概念方面

(31,10):错误3015:映射从行开始的片段时出现问题 31,56:FORECAST表中的外键约束“FORECAST\u Period” (PeriodID,DocEntry)到表期间(DocEntry,Code)::不足 映射:外键必须映射到某个关联或 参与上的外键关联的EntitySet 概念方面

(41,10):错误3015:映射从行开始的片段时出现问题 41,56:来自预测表的外键约束“FORECAST\u Sku” (FTTSkuLineNum,DocEntry)到表SKU(DocEntry,Code)::不足 映射:外键必须映射到某个关联或 参与上的外键关联的EntitySet 概念方面

当我更改外键定义的顺序时,不存在此错误。但它无法读取导航属性数据。我检查了探查器中生成的SQL,发现连接条件也不正确

喂,我换成

 modelBuilder.Entity<FORECAST>()
                         .HasRequired<SKU>(d => d.FTTSku)
                         .WithMany()
                         .HasForeignKey(k => new { k.SkuLineNum, k.DocEntry });
modelBuilder.Entity()
.HasRequired(d=>d.FTTSku)
.有很多
.HasForeignKey(k=>new{k.SkuLineNum,k.DocEntry});
下面是生成的SQL,这也是错误的

内部连接[dbo]。[SKU]作为[Extent13]在([Extent10]。[DocEntry]=[Extent13]。[Code])和([Extent10]。[SkuLineNum]=[Extent13]。[DocEntry])作为[Join7]


原因可能是什么?

不太清楚出了什么问题。我只是试着重新写一遍。关联和键与我在问题中定义的相同,但是现在它起作用了

我的实体在哪里,或者更确切地说,在哪里

 [Table("@FORECAST")]
    public class FORECAST : BindableBase
    {

        private int _code;        
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Browsable(false)]        
        public int Code
        {
            get { return this._code; }
            set { SetProperty(ref _code, value); }
        }

        private string _Name;
        [Browsable(false)]
        public string Name
        {
            get { return this._Name; }
            set { SetProperty(ref _Name, value); }
        }

        private int _DocEntry;
        public int DocEntry
        {
            get { return this._DocEntry; }
            set { SetProperty(ref _DocEntry, value); }
        }

        private int _PeriodID;
        public int PeriodID
        {
            get { return this._PeriodID; }
            set { SetProperty(ref _PeriodID, value); }
        }

        private int _SkuLineNum;
        public int SkuLineNum
        {
            get { return this._SkuLineNum; }
            set { SetProperty(ref _SkuLineNum, value); }
        }

        private int _CustLineNum;
        public int CustLineNum
        {
            get { return this._CustLineNum; }
            set { SetProperty(ref _CustLineNum, value); }
        }

        private decimal _Value;
        [DisplayName("Forecast value")]
        public decimal Value
        {
            get { return this._Value; }
            set { SetProperty(ref _Value, value); }
        }

        private CUST _FTTCust;
        public virtual CUST FTTCust
        {
            get { return this._FTTCust; }
            set { SetProperty(ref _FTTCust, value); }
        }

        private Period _FTTPeriod;
        public virtual Period FTTPeriod
        {
            get { return this._FTTPeriod; }
            set { SetProperty(ref _FTTPeriod, value); }
        }

        private SKU _FTTSku;
        public virtual SKU FTTSku
        {
            get { return this._FTTSku; }
            set { SetProperty(ref _FTTSku, value); }
        }
    }


[Table("@SKU")]
    public partial class SKU
    {

        [Browsable(false)]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]       
        public int Code { get; set; }

        [Browsable(false)]      
        public int DocEntry { get; set; }

        [StringLength(15)]
        [DisplayName("Item Code")]
        public string ItemCode { get; set; }

        [StringLength(100)]
        [DisplayName("Item Name")]
        public string Name { get; set; }

        [StringLength(15)]
        [DisplayName("H Level 0")]
        public string Level0 { get; set; }

        [StringLength(15)]
        [DisplayName("H Level 1")]
        public string Level1 { get; set; }

    }

这肯定很奇怪。您是否可以发布至少两个实体的相关部分,例如
FORECAST
SKU
,以重现问题?是的,这绝对奇怪。我正在尝试更新.net framework版本,当我的包中出现一些错误时,我恢复了我的解决方案,并重新编写了模型和关联。现在它似乎起作用了o