1. ホーム
  2. c#

[解決済み] タイプ間の関連付けの主要端を決定できない【重複】。

2022-02-17 13:16:02

質問

こんな状況です。 2つのタイプの ElectricConsumer すなわち CommercialConsumers 国内消費者(Quaters)と1つの Quater が1つに割り当てられています。 Employee . 以下は私のコードですが、例外に遭遇しています。

EFcodefirstDemo.CodeFistModel.Quater および EFcodefirstDemo.CodeFistModel.Quater のタイプ間の関連付けの主端を決定できない。 EFcodefirstDemo.CodeFistModel.Employee。この主端は のいずれかを使用して明示的に設定する必要があります。 リレーション・フルエント API あるいはデータ・アノテーションを使用します。

私はEFの初心者なので、どこかで間違いを犯しているのは分かっています。あなたがこの問題を解決することを願っています。

public class Employee
{
    public Employee()
    {
        MeterReadings = new List<MeterReading>();
        MeterReadings = new List<MeterReading>();
    }

    [Key]
    [Column(Order = 1)]

    public int EmployeeID { get; set; }
    [Key]
    [Column(Order = 2)]

    public Int64 EmployeeNo { get; set; }
    public String EmployeeName { get; set; }
    [DefaultValue(true)]
    public bool Gender { get; set; }
    [DefaultValue(true)]

    public bool HasResidence { get; set; }
    public bool IsInDivision { get; set; }

    public int? ManagerID { get; set; }
    public virtual Employee Manager { get; set; }


    public virtual Department Deparment { get; set; }
    public int QuaterID { get; set; }
    [ForeignKey("QuaterID")]
     public virtual Quater Quater { get; set; }

    public virtual ICollection<MeterReading> MeterReadings { get; set; }

}

public partial class ElectricConsumer
{
    [Key]
    public int ElectricConsumerID { get; set; }
    public String Area { get; set; }
    [MaxLength(350)]
    public String Address { get; set; }
    public virtual ICollection< Meter> Meters { get; set; }
}




public partial class Quater : ElectricConsumer
{

    public Quater()
    {
        //  Meters = new List<Meter>();
    }

    public int QuaterNo { get; set; }
    public int QuaterPortionNo { get; set; }
    public virtual Employee Employee { get; set; }


}

public partial class CommericalCustomer : ElectricConsumer
{
    public CommericalCustomer()
    {
        //   Meters = new List<Meter>();
    }
      public String Name { get; set; }
    [Index("NicIndex", IsUnique = true)]
    public Int64 NIC { get; set; }

    public int ShopNo { get; set; }


}


public partial class Meter
{
    public Meter()
    {
        InstalledDate = DateTime.Now;
        MeterReadings = new List<MeterReading>();
        ElectricBills = new List<ElectricBill>();
    }

    [Key]
    [Column(Order = 1)]
    public int MeterID { get; set; }
    [Key]
    [Column(Order = 2)]
    public int MeterNo { get; set; }
    [DefaultValue(1)]
    public int Phase { get; set; }

    public DateTime InstalledDate { get; set; }
    [DefaultValue(true)]
    public bool IsOperating { get; set; }

    public virtual ElectricConsumer ElectricConsumer { get; set; }
    public virtual ICollection<MeterReading> MeterReadings { get; set; }
    public virtual ICollection<ElectricBill> ElectricBills { get; set; }
}

解決方法は?

この例外が発生するのは、あなたが 一対一の関係 を指定していないのですが どの端 がリレーションシップの主体であることを示します。 プリンシパル endは、最初に挿入されるもので、依存するものなしに存在することができます。 従属 エンドはプリンシパルに対する外部キーを持っているので、プリンシパルの後に挿入されなければなりません。この特定の問題を解決するには Required データアノテーション(おそらく Quater エンティティはこの場合、従属物である)。

public partial class Quater : ElectricConsumer
{   
  //...    
  [Required]
  public virtual Employee Employee { get; set; }
}