0

簡潔にするために、すべてを少しトリミングします。多対多の関係を持つ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"

ここでいくつかの基本的なデータベース設計の概念が欠けていますか、それともエンティティフレームワークと関係がありますか?

4

1 に答える 1

2

マッピングは逆方向です。MSDNブログ投稿から

> modelBuilder.Entity<Post>()
>                 .HasMany(p => p.Tags)
>                 .WithMany(t => t.Posts)
>                 .Map(mc =>
>                    {
>                        mc.ToTable("PostJoinTag");
>                        mc.MapLeftKey("PostId");
>                        mc.MapRightKey("TagId");
>                    });

MapLeftKeyとMapRightKeyを指定するときは注意が必要です。左はあなたが指した最初のクラスの鍵、つまりポストであり、右は関係の反対側です。これらを逆にすると、データが正しく保存されず、ユーザーは非常に混乱します。

試す:

 modelBuilder.Entity<User>()
            .HasMany(c => c.Domains)
            .WithMany(p => p.Users)
            .Map(
            m =>
            {
                m.MapLeftKey("UserId");
                m.MapRightKey("DomainId");
                m.ToTable("DomainUsers");
            });
于 2013-02-28T03:24:25.270 に答える