C# 与Fluent API(现有数据库)的多对多关系

C# 与Fluent API(现有数据库)的多对多关系,c#,sql-server,asp.net-mvc,C#,Sql Server,Asp.net Mvc,我的应用程序将有用户和组。用户可以是多个组的一部分。组也可以有多个用户 我一直在用它作为参考。特别是,底部附近的部分标有“许多关系”。该示例和我的项目之间的区别在于我的表已经存在,我需要将模型映射到它。我怀疑我应该能够从成员资格表中删除主键,这可能会起作用(因为它与示例更接近),但我希望在处理数据库表之前确保这一点。我的Fluent也很可能是完全错误的 编辑 当我进一步研究这个问题的答案时,我偶然发现了一些可以提高答案质量的东西。我想指出的是,它需要能够独立地添加用户,用户组,以及成员身份 SQ

我的应用程序将有用户和组。
用户
可以是多个
的一部分。
也可以有多个
用户

我一直在用它作为参考。特别是,底部附近的部分标有“许多关系”。该示例和我的项目之间的区别在于我的表已经存在,我需要将模型映射到它。我怀疑我应该能够从
成员资格
表中删除主键,这可能会起作用(因为它与示例更接近),但我希望在处理数据库表之前确保这一点。我的
Fluent
也很可能是完全错误的

编辑

当我进一步研究这个问题的答案时,我偶然发现了一些可以提高答案质量的东西。我想指出的是,它需要能够独立地添加
用户
用户组
,以及
成员身份

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; }
}
公共类用户组
{ 
public int GroupID{set;get;}
公共字符串名称{set;get;}
公共字符串注释{set;get;}
公共虚拟ICollection用户{set;get;}
}
公共类用户
{
公共字符串SomeID{set;get;}
公共字符串名{set;get;}
公共字符串LastName{set;get;}
公共字符串电子邮件{set;get;}
公用字符串电话{set;get;}
公共字符串注释{set;get;}
公共虚拟ICollection用户组{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 });
modelBuilder.Entity().ToTable(“用户”、“测试数据库”);
modelBuilder.Entity().HasKey(r=>new{r.SomeID});
modelBuilder.Entity()
.HasMany(r=>r.UserGroups)
.WithMany(r=>r.Users)
.Map(m=>
{
m、 MapLeftKey(“SomeID”);
m、 MapRightKey(“GroupID”);
m、 可转让(“会员”);
});
modelBuilder.Entity().ToTable(“UserGroup”、“TestDB”);
modelBuilder.Entity().HasKey(r=>new{r.GroupID});
当前问题
代码已经更新,以反映我目前拥有的内容。我能够独立地查询
用户
用户组
,但它不允许我访问
导航属性

您不需要或不想让用户在组中,也不想让用户在组中。你应该选一个或另一个。我将如何从UserGroups对象中删除
列表


仍然可以使用Linq查询
User
对象的集合,以生成属于特定组的用户列表。

我找到了答案。我最初的问题相当愚蠢,我比我想象的要近得多。其中一个愚蠢的错误实际上是将两个实体映射到同一个表,这破坏了对该数据库的每次调用

您需要做的第一件事是确保所有的
导航属性都是虚拟的

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

旧的循环引用===不,不,我的脑子里花了很多时间试图将c#模型与数据库设计联系起来。您是否可以编辑您的答案,以反映新数据库的外观以及相应的fluent映射?
modelBuilder.Entity<User>()
        .HasMany(r => r.UserGroups)
        .WithMany(r => r.Users)
        .Map(m =>
            {
                m.MapLeftKey("SomeID");
                m.MapRightKey("GroupID");
                m.ToTable("Membership", "TempDB");
            });