我的应用程序将有用户和组。AUser
可以是多个 1 的一部分Group
。一个Group
也可以有多个User
。
我一直用这个作为参考。特别是底部附近标有“许多关系”的部分。该示例与我的项目之间的区别在于我的表已经存在,我需要将我的模型映射到它。我怀疑我应该能够从Membership
表中删除我的主键并且它可能会起作用(因为它更接近示例),但我想在弄乱数据库表之前确保。我也很可能Fluent
是完全错误的。
编辑
在我进一步研究这个问题的答案时,我偶然发现了一些可以提高所提供答案质量的东西。我想指出的是,它需要能够独立地添加User
、Usergroup
和Membership
。
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 });
当前问题
代码已更新以反映我目前拥有的内容。我可以同时独立查询Users
,UserGroups
但它不允许我访问Navigation Properties
.