簡潔にするために、すべてを少しトリミングします。多対多の関係を持つ2つのモデルがあります。モデルはユーザーとドメインです。このコンテキストでのドメインは、親会社、その姉妹会社、そしておそらくすべて同じ傘下にあるいくつかの中小企業のような大企業の特定の領域です。これはUser.csモデルです
public class User
{
public User()
{
Domains = new HashSet<Domain>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public ICollection<Domain> Domains { get; set; }
}
そして、これがDomain.csモデルです。
public class Domain
{
public Domain()
{
Users = new HashSet<User>();
}
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DomainId { get; set; }
public string DomainName { get; set; }
public ICollection<User> Users { get; set; }
}
次に、Context.csでこの派手な魔法を実行します
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(c => c.Domains)
.WithMany(p => p.Users)
.Map(
m =>
{
m.MapLeftKey("DomainId");
m.MapRightKey("UserId");
m.ToTable("DomainUsers");
});
base.OnModelCreating(modelBuilder);
}
これにより、DomainUsersテーブルが適切に作成されます。DomainIDとUserIDで2列のテーブルを作成します。
シードされたデータには、1人のユーザー(UserId = 1)と3つのドメイン(ID = 1,2,3)があります。ルックアップテーブルに、次の1つのレコードを追加できます。
UserID | DomainId
1 | 1
しかし、別のものを追加しようとすると、次のようになります。
UserID | DomainId
1 | 1
1 | 2
次のエラーが発生します。
The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_dbo.DomainUsers_dbo.Users_DomainId". Conflict occured in database "MyDatabase"
table "dbo.Users", column "UserId"
ここでいくつかの基本的なデータベース設計の概念が欠けていますか、それともエンティティフレームワークと関係がありますか?