0

我的应用程序将有用户和组。AUser可以是多个 1 的一部分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.

4

2 回答 2

1

我想到了。我最初的问题非常愚蠢,而且我比我想象的更接近。其中一个愚蠢的错误实际上是将两个实体映射到同一个表,这会破坏对该数据库的每次调用。

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

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

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

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

另一个伟大的来源

于 2013-01-16T07:31:24.537 回答
0

您不需要或不希望在用户组和用户组中拥有用户。你应该选择其中之一。恕我直言,我会List <user>从 UserGroups 对象中删除。

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

于 2013-01-16T05:49:33.787 回答