EF 代码优先 - 具有额外列的多对多关系映射 table
EF Code first - many to many relation mapping table with extra columns
我有一个用户模型和一个组模型。用户和组共享多对多关系。当我将其翻译成 table 时,我想要一个映射 table。我正在使用以下方法来实现这一点。
modelBuilder.Entity<UserGroup>()
.HasMany(a => a.Users)
.WithMany(b => b.UserGroup)
.Map(mc =>
{
mc.ToTable("UserUserGroupMapping");
mc.MapLeftKey("UserId");
mc.MapRightKey("UserGroupId");
});
这将创建一个 table,其中 UserId 和 UserGroupId 作为列。但是我几乎没有挑战,
我希望能够向此 table 添加一个标识列,并向 table 添加一些审计列(例如:创建者、创建日期)。我不知道该怎么做。
有人可以帮我吗?
谢谢
我认为如果您执行以下操作将会奏效:
- 删除您在上面的代码片段中显示的配置
添加映射 table 并配置其 table 名称以匹配原始 table 名称。
// name this whatever you want
class UserUserGroupMapping
{
public UserUserGroupMappingId { get; set; }
public int UserId { get; set; }
public virtual User User { get; set; }
public int UserGroupId { get; set; }
public virtual UserGroup UserGroup { get; set; }
// other properties
}
modelBuilder.Entity<UserUserGroupMapping>()
.HasKey(um => um.UserUserGroupMappingId)
.ToTable("UserUserGroupMapping");
将User
和UserGroup
中的多对多集合属性替换为一对多关联
class User
{
// other properties
// remove this:
// public virtual ICollection<UserGroup> UserGroup { get; set; }
public virtual ICollection<UserUserGroupMapping> UserGroupMappings { get; set; }
}
class UserGroup
{
// other properties
// remove this:
// public virtual ICollection<User> Users { get; set; }
public virtual ICollection<UserUserGroupMapping> UserMappings { get; set; }
}
modelBuilder.Entity<UserUserGroupMapping>()
.HasRequired(um => um.UserGroup).WithMany(g => g.UserMappings)
.HasForeignKey(um => um.UserGroupId);
modelBuilder.Entity<UserUserGroupMapping>()
.HasRequired(um => um.User).WithMany(g => g.UserGroupMappings)
.HasForeignKey(um => um.UserId);
使用包管理器 Add-Migration
并从脚手架迁移中删除任何可能试图删除旧的 table 并创建新的 table 的东西。迁移至少需要(我可能在这里遗漏了一些):
DropPrimaryKey
用于原始键列
AddColumn
用于新列(Int(identity:true, nullable: false)
用于新主键列)
AddPrimaryKey
用于新键列
然后您可以使用 this answer 中概述的方法来检索实体。
我有一个用户模型和一个组模型。用户和组共享多对多关系。当我将其翻译成 table 时,我想要一个映射 table。我正在使用以下方法来实现这一点。
modelBuilder.Entity<UserGroup>()
.HasMany(a => a.Users)
.WithMany(b => b.UserGroup)
.Map(mc =>
{
mc.ToTable("UserUserGroupMapping");
mc.MapLeftKey("UserId");
mc.MapRightKey("UserGroupId");
});
这将创建一个 table,其中 UserId 和 UserGroupId 作为列。但是我几乎没有挑战,
我希望能够向此 table 添加一个标识列,并向 table 添加一些审计列(例如:创建者、创建日期)。我不知道该怎么做。
有人可以帮我吗?
谢谢
我认为如果您执行以下操作将会奏效:
- 删除您在上面的代码片段中显示的配置
添加映射 table 并配置其 table 名称以匹配原始 table 名称。
// name this whatever you want class UserUserGroupMapping { public UserUserGroupMappingId { get; set; } public int UserId { get; set; } public virtual User User { get; set; } public int UserGroupId { get; set; } public virtual UserGroup UserGroup { get; set; } // other properties }
modelBuilder.Entity<UserUserGroupMapping>() .HasKey(um => um.UserUserGroupMappingId) .ToTable("UserUserGroupMapping");
将
User
和UserGroup
中的多对多集合属性替换为一对多关联class User { // other properties // remove this: // public virtual ICollection<UserGroup> UserGroup { get; set; } public virtual ICollection<UserUserGroupMapping> UserGroupMappings { get; set; } } class UserGroup { // other properties // remove this: // public virtual ICollection<User> Users { get; set; } public virtual ICollection<UserUserGroupMapping> UserMappings { get; set; } }
modelBuilder.Entity<UserUserGroupMapping>() .HasRequired(um => um.UserGroup).WithMany(g => g.UserMappings) .HasForeignKey(um => um.UserGroupId); modelBuilder.Entity<UserUserGroupMapping>() .HasRequired(um => um.User).WithMany(g => g.UserGroupMappings) .HasForeignKey(um => um.UserId);
使用包管理器
Add-Migration
并从脚手架迁移中删除任何可能试图删除旧的 table 并创建新的 table 的东西。迁移至少需要(我可能在这里遗漏了一些):DropPrimaryKey
用于原始键列AddColumn
用于新列(Int(identity:true, nullable: false)
用于新主键列)AddPrimaryKey
用于新键列
然后您可以使用 this answer 中概述的方法来检索实体。