EF6 代码首先是多对多,附加 属性 与其中一个实体上的 collection 类型相同
EF6 code first Many to Many with additional property of the same type as the collection on one of the entities
我知道这个问题在 SO 上有很多类似的问题,但我找不到与我的问题完全相同的问题,但我可能错了,确实存在一个。所以这是我的问题:
我们有两个实体 (C# poco 类),Meeting 和 User,它们中的每一个都包含另一个实体的 collection。为简洁起见缩短的代码:
public class Meeting
{
public int ModeratorId { get; set; }
public virtual User Moderator { get; set; } // Property of type User
public virtual ICollection<User> Participants { get; set; } // Collection of User
}
这是第二个:
public class User
{
public virtual ICollection<Meeting> Meetings { get; set; }
}
现在,在添加迁移时,人们会期望 EF 会创建一个链接 table,类似于 MeetingUsers ,如果我省略 Moderator 属性,它实际上会创建。但是当我添加 Moderator 属性 时,它与 [=43= 中的项目类型相同]Participants,EF去掉链接table,添加一个Meeting_Id迁移中的列。以下是迁移:
第一次迁移,只有两个 类 上的 collection,没有额外的 Moderator 属性 会议:
public override void Up()
{
CreateTable(
"dbo.MeetingUsers",
c => new
{
Meeting_Id = c.String(nullable: false, maxLength: 128),
User_ID = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Meeting_Id, t.User_ID })
.ForeignKey("dbo.Meetings", t => t.Meeting_Id, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.User_ID, cascadeDelete: true)
.Index(t => t.Meeting_Id)
.Index(t => t.User_ID);
}
您可以看到 EF 创建链接 table 很好(我省略了 Meeting 和 用户 为简洁起见)。
这是我添加 Moderator 属性:
后 EF 添加的第二个迁移
public override void Up()
{
DropForeignKey("dbo.MeetingUsers", "Meeting_Id", "dbo.Meetings");
DropForeignKey("dbo.MeetingUsers", "User_ID", "dbo.Users");
DropIndex("dbo.MeetingUsers", new[] { "Meeting_Id" });
DropIndex("dbo.MeetingUsers", new[] { "User_ID" });
AddColumn("dbo.Users", "Meeting_Id", c => c.String(maxLength: 128));
AddColumn("dbo.Meetings", "ModeratorId", c => c.Int());
AddColumn("dbo.Meetings", "User_ID", c => c.Int());
CreateIndex("dbo.Users", "Meeting_Id");
CreateIndex("dbo.Meetings", "ModeratorId");
CreateIndex("dbo.Meetings", "User_ID");
AddForeignKey("dbo.Meetings", "ModeratorId", "dbo.Users", "ID");
AddForeignKey("dbo.Users", "Meeting_Id", "dbo.Meetings", "Id");
AddForeignKey("dbo.Meetings", "User_ID", "dbo.Users", "ID");
DropTable("dbo.MeetingUsers");
}
如您所见,EF 删除了链接 table 并在 Users table 上添加了一列,这不是我想要的。我想保留链接 table 并只添加一个新列 ModeratorId 到 会议 table.
我该如何实现?我可能会补充说,我们始终使用数据注释,而不是 EF 的流畅 api。
谢谢,
阿希隆
您可以手动定义 link table 就可以了。
public class Meeting
{
public int ModeratorId { get; set; }
public virtual User Moderator { get; set; } // Property of type User
}
And here's the second one:
public class User
{
.....
}
public MeetingUser{
public int UserId{get;set;}
public virtual User User{get;set;}
public int MeetingId {get;set;}
public virtual Meeting Meeting {get;set;}
}
我知道这个问题在 SO 上有很多类似的问题,但我找不到与我的问题完全相同的问题,但我可能错了,确实存在一个。所以这是我的问题:
我们有两个实体 (C# poco 类),Meeting 和 User,它们中的每一个都包含另一个实体的 collection。为简洁起见缩短的代码:
public class Meeting
{
public int ModeratorId { get; set; }
public virtual User Moderator { get; set; } // Property of type User
public virtual ICollection<User> Participants { get; set; } // Collection of User
}
这是第二个:
public class User
{
public virtual ICollection<Meeting> Meetings { get; set; }
}
现在,在添加迁移时,人们会期望 EF 会创建一个链接 table,类似于 MeetingUsers ,如果我省略 Moderator 属性,它实际上会创建。但是当我添加 Moderator 属性 时,它与 [=43= 中的项目类型相同]Participants,EF去掉链接table,添加一个Meeting_Id迁移中的列。以下是迁移:
第一次迁移,只有两个 类 上的 collection,没有额外的 Moderator 属性 会议:
public override void Up()
{
CreateTable(
"dbo.MeetingUsers",
c => new
{
Meeting_Id = c.String(nullable: false, maxLength: 128),
User_ID = c.Int(nullable: false),
})
.PrimaryKey(t => new { t.Meeting_Id, t.User_ID })
.ForeignKey("dbo.Meetings", t => t.Meeting_Id, cascadeDelete: true)
.ForeignKey("dbo.Users", t => t.User_ID, cascadeDelete: true)
.Index(t => t.Meeting_Id)
.Index(t => t.User_ID);
}
您可以看到 EF 创建链接 table 很好(我省略了 Meeting 和 用户 为简洁起见)。
这是我添加 Moderator 属性:
public override void Up()
{
DropForeignKey("dbo.MeetingUsers", "Meeting_Id", "dbo.Meetings");
DropForeignKey("dbo.MeetingUsers", "User_ID", "dbo.Users");
DropIndex("dbo.MeetingUsers", new[] { "Meeting_Id" });
DropIndex("dbo.MeetingUsers", new[] { "User_ID" });
AddColumn("dbo.Users", "Meeting_Id", c => c.String(maxLength: 128));
AddColumn("dbo.Meetings", "ModeratorId", c => c.Int());
AddColumn("dbo.Meetings", "User_ID", c => c.Int());
CreateIndex("dbo.Users", "Meeting_Id");
CreateIndex("dbo.Meetings", "ModeratorId");
CreateIndex("dbo.Meetings", "User_ID");
AddForeignKey("dbo.Meetings", "ModeratorId", "dbo.Users", "ID");
AddForeignKey("dbo.Users", "Meeting_Id", "dbo.Meetings", "Id");
AddForeignKey("dbo.Meetings", "User_ID", "dbo.Users", "ID");
DropTable("dbo.MeetingUsers");
}
如您所见,EF 删除了链接 table 并在 Users table 上添加了一列,这不是我想要的。我想保留链接 table 并只添加一个新列 ModeratorId 到 会议 table.
我该如何实现?我可能会补充说,我们始终使用数据注释,而不是 EF 的流畅 api。
谢谢,
阿希隆
您可以手动定义 link table 就可以了。
public class Meeting
{
public int ModeratorId { get; set; }
public virtual User Moderator { get; set; } // Property of type User
}
And here's the second one:
public class User
{
.....
}
public MeetingUser{
public int UserId{get;set;}
public virtual User User{get;set;}
public int MeetingId {get;set;}
public virtual Meeting Meeting {get;set;}
}