20

WinForms プロジェクト、.net 4.5 で EntityFramework バージョン 5.0 を使用しています。

重要なエンティティを 2 つ作成しました

    public class Role
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public string Name { get; set; }
        public bool StockPermission { get; set; }
        public bool ItemPermission { get; set; }
        public bool OrderPermission { get; set; }
        public bool PersonPermission { get; set; }
        public bool StatisticPermission { get; set; }
    }

    public class Person
    {
        [Key]
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }
        public String Name { get; set; }
        public String Nickname { get; set; }
        public String Contact { get; set; }
        public System.DateTime Created { get; set; }
        public String Pincode { get; set; }

        public virtual ICollection<Role> Role { get; set; }
        public virtual Person Creator { get; set; }
    }

および dbContext クラス:

    public class SusibarDbContext : DbContext
    {
        public DbSet<Entity.Role> Roles { get; set; }
        public DbSet<Entity.Person> Persons { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            //base.OnModelCreating(modelBuilder);
        }
    }

OnModelCreating(DbModelBuilder modelBuilder)Person と Role の関係を定義するために関数に追加する必要があるものを教えてください。

Person は多くの Role(s) を持つことができます (ただし、null にすることはできません)。異なる Person が同じ Role(s) を持つことができます。

Person は 1 つの "creator" Person を持つことができます (null の場合もあります)。異なる Person は同じ "creator" を持つことができます

あなたがとても親切にできるなら、私に解決策を教えてください:-(

4

3 に答える 3

17

Fluent API を使用する場合は、MSDNのこのトピックを参照してください。多対多の関係を使用する必要があり、EF は、Person が多くの Role を持つことができ、Role が多くの Person を持つ場合に必要なテーブルを作成します。このようなもの:

modelBuilder.Entity<Person>().HasMany(x => x.Roles).WithMany();

また、Fluent API を使用せずにこの関係を作成することもできます。Role クラスでナビゲーション プロパティを作成する必要がありますICollection<Person> Persons。EF は適切なテーブルとリレーションシップも作成します。

于 2012-12-08T08:59:57.003 に答える
1

このようなものが仕事をするはずです:

という POCO を作成しますPersonRolePersonこれは、 aと aの関係をモデル化することを目的としていRoleます。

public class PersonRole
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
    public Person Person { get; set; }
    public Role Role { get; set; }
}

クラスで、Person次を置き換えます。

public virtual ICollection<Role> Role { get; set; }

と:

public virtual ICollection<PersonRole> PersonRoles { get; set; }

Role必要に応じて、次をクラスに追加できます。

public virtual ICollection<PersonRole> PersonRoles { get; set; }

Peopleそうすることはオプションですが、particualで全体を見たい場合には便利かもしれませんRole

メソッドで、OnModelCreatingこのコードを使用して、 aPersonRoleが null 非許容PersonRoleプロパティを強制するようにします。

modelBuilder.Entity<PersonRole>().HasRequired(p => p.Person);
modelBuilder.Entity<PersonRole>().HasRequired(p => p.Role);

編集:

PersonRolePOCOを作成する理由は、Roleさまざまなユーザー間で を再利用できるようにするためです。既存のものを使用してpublic virtual ICollection<Role> Role { get; set; }も機能しますが、意図したとおりに機能しない可能性があります。

リレーションシップを使用してpublic virtual ICollection<Role> Role { get; set; }、EF が行おうとしているのはRole、追加のフィールド (たとえば、PersonIdを に関連付けるために使用される ) でテーブルを拡張するPersonことRolesです。これに関する問題は明らかです。リンクPersonRoleテーブルがなければ、2 人のユーザーに同じ を与えることはできませんRole

于 2012-12-07T01:16:45.960 に答える