私のアプリケーションにはユーザーとグループがあります。AUser
は、複数の の一部になることができますGroup
。AGroup
は複数の を持つこともできますUser
。
私はこれを参考にしてきました。特に、「多くの関係」とラベル付けされた下部近くの部分。その例と私のプロジェクトの違いは、テーブルが既に存在し、モデルをそれにマップする必要があることです。テーブルから主キーを削除できるはずだと思いますが、Membership
うまくいくかもしれません (例とほぼ一致するため) が、データベーステーブルをいじる前に確認したいと思います。私Fluent
が完全に間違っている可能性も非常に高いです。
編集
この質問への回答をさらに調査していると、提供される回答の質を高める可能性のあるいくつかのことに遭遇しました。User
、Usergroup
、および を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)
)
注: SomeID
ID は別のシステムを介して指定されるため、そのように命名されています。データベースは、この特定の 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
.