0

私のアプリケーションにはユーザーとグループがあります。AUserは、複数の の一部になることができますGroup。AGroupは複数の を持つこともできますUser

私はこれを参考にしてきました。特に、「多くの関係」とラベル付けされた下部近くの部分。その例と私のプロジェクトの違いは、テーブルが既に存在し、モデルをそれにマップする必要があることです。テーブルから主キーを削除できるはずだと思いますが、Membershipうまくいくかもしれません (例とほぼ一致するため) が、データベーステーブルをいじる前に確認したいと思います。私Fluentが完全に間違っている可能性も非常に高いです。

編集

この質問への回答をさらに調査していると、提供される回答の質を高める可能性のあるいくつかのことに遭遇しました。UserUsergroup、および をMembership独立して追加できる必要があることに注意してください。

SQL

CREATE TABLE TestDB.[UserGroup]
(
    GroupID int identity not null,
    Name varchar(100) not null,
    Comment varchar(1000)

    PRIMARY KEY(GroupID)
)
CREATE TABLE TestDB.[User]
(
    SomeID int not null,
    FirstName varchar(100) not null,
    LastName varchar(100) not null,
    Middle varchar(1) not null,
    Email varchar(100) not null,
    Phone varchar(16) not null,
    Comment varchar(1000)

    PRIMARY KEY(SomeID)
)
CREATE TABLE TestDB.[Membership]
(
    MembershipID int identity not null,
    GroupID int not null,
    SomeID int not null

    PRIMARY KEY(MembershipID)
    FOREIGN KEY(GroupID) references TestDB.[UserGroup](GroupID),
    FOREIGN KEY(SomeID) references TestDB.[User](SomeID)
)

注: SomeIDID は別のシステムを介して指定されるため、そのように命名されています。データベースは、この特定の ID を自動的に生成しません。一意であることが保証されています。

モデル

public class UserGroup
{ 
    public int GroupID { set; get; }
    public string Name { set; get; }
    public string Comment { set; get; }

    public virtual ICollection<User> Users { set; get; }
}
public class User
{
    public string SomeID { set; get; }
    public string FirstName { set; get; }
    public string LastName { set; get; }
    public string Email { set; get; }
    public string Phone { set; get; }
    public string Comment { set; get; }

    public virtual ICollection<UserGroup> UserGroups { set; get; }
}

流暢なマッピング

modelBuilder.Entity<User>().ToTable("User", "TestDB");
modelBuilder.Entity<User>().HasKey(r => new { r.SomeID });
modelBuilder.Entity<User>()
            .HasMany(r => r.UserGroups)
            .WithMany(r => r.Users)
            .Map(m =>
                {
                    m.MapLeftKey("SomeID");
                    m.MapRightKey("GroupID");
                    m.ToTable("Membership");
                });

modelBuilder.Entity<UserGroup>().ToTable("UserGroup", "TestDB");
modelBuilder.Entity<UserGroup>().HasKey(r => new { r.GroupID });

現在の問題 コードは、私が現在持っているものを反映するように更新されました。Users両方とUserGroups個別にクエリを実行できますが、 Navigation Properties.

4

2 に答える 2

1

私はそれを考え出した。私の最初の問題はかなりばかげていて、思っていたよりずっと近かった。それらのばかげた間違いの1つは、実際には2つのエンティティを同じテーブルにマッピングし、そのデータベースへのすべての呼び出しを中断することでした。

最初に行う必要があるのは、すべてNavigation propertiesが仮想であることを確認することです。

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

ここから、FluentAPIマッピングを理解する必要があります。最初は、のスキーマを含めるのを忘れていたため、からへToTableのトラバースができませんでした。既存のデータベースで作業していない場合、ブロックは必要ありません。キーとを含むテーブルが自動的に生成されます。テーブル名は、連結された2つの子テーブル名の結果になります。詳細はこちらをご覧ください。既存のデータベースを操作する場合、これにより、作成したテーブルが既に作成したテーブルにマップされます。UserUserGroup.MapSomeIDGroupID

modelBuilder.Entity<User>()
        .HasMany(r => r.UserGroups)
        .WithMany(r => r.Users)
        .Map(m =>
            {
                m.MapLeftKey("SomeID");
                m.MapRightKey("GroupID");
                m.ToTable("Membership", "TempDB");
            });

もう一つの素晴らしい情報源

于 2013-01-16T07:31:24.537 に答える
0

ユーザーをグループに、グループをユーザーに含める必要はありません。どちらかを選択する必要があります。IMHOUserGroupsList <user>オブジェクトから削除します。

オブジェクトのコレクションUserをLinqでクエリして、特定のグループに属するユーザーのリストを生成することもできます。

于 2013-01-16T05:49:33.787 に答える