0

为了简洁起见,我将把所有内容都精简一下。我有两个模型,它们将具有多对多关系。模型是用户和域。在这种情况下,域是一个大公司的某个领域,比如母公司,它的姐妹公司,也许还有一些小公司都在同一个伞下。这是 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 制作两列表。

在我的种子数据中,我有一个用户(UserId = 1)和三个域(ID = 1、2、3)。在查找表上,我可以添加一条记录:

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 时需要小心。Left 将是您指向的第一个类的键,即 Post,而 right 是关系的另一端。如果你把这些倒过来,你的数据将被错误地存储,你的用户会很困惑。

尝试:

 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 回答