2

最初にエンティティ フレームワーク コードを使用しています。2 つのエンティティ (ユーザーとプロファイル) があり、それらの間の関係は 1 対多です。つまり、1 人のユーザーは 1 つのプロファイルしか持つことができませんが、1 つのプロファイルは多くのユーザーに割り当てることができます。エンティティの下:

[Table("Users")]
public class User
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public virtual string Name { get; set; }

    [Required]
    [ForeignKey("Profile")]
    public virtual int ProfileId { get; set; }
    public virtual Profile Profile { get; set; }

    public virtual ICollection<AnotherEntityB> anotherEntityB { get; set; } 
}

[Table("Profiles")]
public class Profile
{
    [Key(), Required]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required]
    public virtual string Name { get; set; }

    // Below the user that performs the discharge of the profile. Only 1 user can do it.
    [ForeignKey("User")]
    public virtual int? UserId { get; set; }
    public virtual User User { get; set; }

    public virtual DateTime? dischargeDate { get; set; } <-- this is the date that user performs the discharge of the profile

    public virtual ICollection<User> Users { get; set; }


    public virtual ICollection<AnotherEntityC> anotherEntityC { get; set; }
}

また、OnModelCreating メソッドのいくつかの規則を削除しました。

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

問題は、EF がユーザー エンティティに 2 つの外部キーを作成していることです。

ProfileId (FK, int, No NULL)
Profile_Id (FK, int, NULL)

また、Users エンティティには外部キーを 1 つだけ含める必要があります: ProfileId (FK, int, No NULL)

どうしたの?

4

1 に答える 1

5

2 つのナビゲーション プロパティがUserありUsersProfileその中でエンティティを参照しているため、 EF は規則によって、どちらがエンティティUserの逆プロパティに属しているかを判断できません。次の属性を使用してヒントを与える必要があります。ProfileUser[InverseProperty]

[InverseProperty("Users")]
public virtual Profile Profile { get; set; }

User.Profileここで、が の逆ナビゲーション プロパティでProfile.Usersあり、両方が同じ関係の終点であることを定義します。属性がない場合、EF は、2 つのナビゲーション プロパティが 2 つの異なる関係の終わりであり、そのうちの 1 つが追加の外部キーを担当すると想定しますProfile_Id

ここで、もう少し背景を説明します。

于 2013-05-20T21:52:50.543 に答える