3

私は何時間もこれに取り組んでいて、検索で見つけた多くの提案を試しましたが、うまくいきませんでした。コードファーストのEF 5を使用しています。

状況は、私が従業員クラスを持っているということです。次に、2 つのプロパティを持つ別のクラスがあり、どちらも Employee 型です。これらの両方を外部キー制約にしたいのですが、要件により、同じユーザーとの間で同じ要求の多くが許可されるため、それらをキーとして使用することはできません。Employee がナビゲーション用の 2 つのコレクションを持っていることはあまり気にしませんが、要件と思われる問題に取り組んでいます。問題が単純化されている場合は、それらを削除できます。

このメッセージが表示されます。System.Data.Entity.Edm.EdmAssociationEnd: : 関係 'Employee_RequestsForEmployee' のロール 'Employee_RequestsForEmployee_Target' では多重度が無効です。従属ロール プロパティはキー プロパティではないため、従属ロールの多重度の上限は「*」である必要があります。

コンテキストの OnModelCreation メソッドで Fluent API を使用してこれを試しました。

modelBuilder.Entity() .HasRequired(u => u.ForEmployee) .WithMany() .HasForeignKey(u => u.ForEmployeeId);

        modelBuilder.Entity<RevenueTransferRequest>()
                    .HasRequired(u => u.FromEmployee)
                    .WithMany()
                    .HasForeignKey(u => u.FromEmployeeId);

競合するクラスは次のとおりです (わかりやすくするためにいくつかのプロパティを削除しました)。

    public class Employee : IEmployee
    {
        [Key]
        public string Id { get; set; }

        [InverseProperty("ForEmployee")]
        public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; }

        [InverseProperty("FromEmployee")]
        public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; }
    }

 public class RevenueTransferRequest : IRevenueTransferRequest
    {
        [Key]
        public Guid Id { get; set; }

        [Required]
        [ForeignKey("ForEmployee")]
        public String ForEmployeeId { get; set; }

        [InverseProperty("RequestsForEmployee")]
        public Employee ForEmployee { get; set; }

        [Required]
        [ForeignKey("FromEmployee")]
        public String FromEmployeeId { get; set; }

        [InverseProperty("RequestsFromEmployee")]
        public Employee FromEmployee { get; set; }
    }

どんな助けでも大歓迎です。前もって感謝します。

4

1 に答える 1

3

データ注釈を使用してそれを行う方法を理解したことがありませんでしたが、Fluent API を使用してそれを行うことができました。私が見逃していたのは、HasMany() メソッドで、反対側の関係が何であるかを指定する必要があったことです。これは、データの注釈と規則を通じて理解されると想定していました。

これは、DbContext OnModelCreating オーバーライドで呼び出されます (WillCascadeOnDelete(false) は別の問題に関連しています)。

    modelBuilder.Entity<RevenueTransferRequest>()
                .HasRequired(e => e.FromEmployee)
                .WithMany(x=>x.RequestsFromEmployee)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<RevenueTransferRequest>()
              .HasRequired(e => e.ForEmployee)
              .WithMany(x => x.RequestsForEmployee)
              .WillCascadeOnDelete(false);

クラスで:

[Key]
        public String Id { get; set; }

        public String BusinessUnitLeaderId { get; set; }

        public Employee BusinessUnitLeader { get; set; }

        [Required]
        [MaxLength(150)]
        public String DisplayName { get; set; }

        public ICollection<Project> BusinessUnitLeaderProjects { get; set; }

        public ICollection<RevenueTransferRequest> RequestsForEmployee { get; set; }

        public ICollection<RevenueTransferRequest> RequestsFromEmployee { get; set; } 

public class RevenueTransferRequest
    {
        [Key]
        public Guid Id { get; set; }

        [Required]
        public String ForEmployeeId { get; set; }

        public Employee ForEmployee { get; set; }

        [Required]
        public String FromEmployeeId { get; set; }

        public Employee FromEmployee { get; set; }

        [Required]
        public String ProjectId { get; set; }

        public Project Project { get; set; }

        [Required]
        public Double? TransferAmount { get; set; }

        public int WorkflowState { get; set; }
    }
于 2013-02-15T21:36:14.060 に答える