繁体   English   中英

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

[英]Many to Many relationship with Fluent API (existing database)

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

我一直以此为参考。 特别是,靠近底部的部分标记为“许多关系”。 该示例与我的项目之间的区别在于,我的表已经存在,并且需要将我的模型映射到该表。 我怀疑我应该能够从Membership表中删除我的主键,并且它可能起作用(因为它与示例更接近),但是我想确保在弄乱数据库表之前。 我的Fluent也很可能是完全错误的。

编辑

在我进一步研究该问题的答案时,我偶然发现了一些可以提高所提供答案质量的东西。 我想指出,需要能够独立添加UserUsergroupMembership

的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 });

当前问题代码已更新,以反映我当前的情况。 我能够查询两个UsersUserGroups独立,但它不会让我访问Navigation Properties

我想到了。 我最初的问题很傻,而且比我想象的要亲密得多。 这些愚蠢的错误之一是实际上将两个实体映射到同一张表,这中断了对该数据库的每次调用。

您需要做的第一件事是确保所有“ Navigation properties都是虚拟的。

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

从这里您需要弄清楚Fluent API映射。 最初我忘记包括ToTable的架构,这不允许我从User遍历到UserGroup 如果您不在现有数据库上工作,则不需要.Map块。 将自动生成一个包含密钥SomeIDGroupID 该表名将是两个子表名串联在一起的结果。 在这里阅读更多。 使用现有数据库时,这只会将其创建的表映射到您已经创建的表。

modelBuilder.Entity<User>()
        .HasMany(r => r.UserGroups)
        .WithMany(r => r.Users)
        .Map(m =>
            {
                m.MapLeftKey("SomeID");
                m.MapRightKey("GroupID");
                m.ToTable("Membership", "TempDB");
            });

另一个伟大的来源

您不需要或不想将用户分为组和用户组。 您应该选择一个。 恕我直言,我将从UserGroups对象中删除List <user>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM