首页 新闻 会员 周边

Entity Framework数据迁移(Migrations)新增多对多关系,为什么如下代码不生成中间表?

0
悬赏园豆:20 [已解决问题] 解决于 2016-08-03 21:29

数据库中有一张Blog表,还有一张Tag表,它们有各自属性。而一开始生成数据库而是直接通过EF生成的,也没有做过数据迁移。

现在希望把BlogTag进行多对多关系进行关联,由于线上数据库应用于生产环境,已经有了真实数据,所以只能使用EF数据迁移来完成了。

于是我在model层的Blog.cs里新增了如下代码:

public virtual IList<Tag> Tags { get; set; }

 

然后在model层的Tag.cs里新增了如下代码:

public virtual ICollection<Blog> Blogs { get; set; }

 

然后开始操作数据迁移,生成的数据迁移为代码如下:

    public override void Up()
    {
        //往dbo.blog表里新增了一列Tag_TagId
        AddColumn("dbo.Blogs", "Tag_TagId", c => c.String(maxLength: 128));
        //往dbo.Tags表里新增了一列Blog_BlogId1
        AddColumn("dbo.Tags", "Blog_BlogId1", c => c.String(maxLength: 128));
        
        CreateIndex("dbo.Blogs", "Tag_TagId");
        CreateIndex("dbo.Tags", "Blog_BlogId1");
        
        AddForeignKey("dbo.Blogs", "Tag_TagId", "dbo.Tags", "TagId");
        AddForeignKey("dbo.Tags", "Blog_BlogId1", "dbo.Blogs", "BlogId");
    }

 

由这段代码可见BlogTag表只是各自新增了外键进行1对1的关联,而不是我希望的多对多关系,还请各位大神指点。

对于这个问题解决方案我的猜想是:是不是对EF的多对多映射关系处理的不正确,需要加一些Attribute做下映射?

万分感谢,祝好。

linkFly的主页 linkFly | 初学一级 | 园豆:91
提问于:2016-08-03 19:27
< >
分享
最佳答案
1

需要OnModelCreating中这样写:

modelBuilder.Entity<blog>()
.HasMany(a => a.tags).WithMany(t => t.Blogs).Map(m =>
{
m.ToTable("blog_tag"); //中间关系表表名
m.MapLeftKey("tagID"); //设置Activity表在中间表主键名
m.MapRightKey("blogID"); //设置Trip表在中间表主键名
});

 

然后再up函数生成迁移:

CreateTable(
"dbo.blog_tag",
c => new
{
tagID = c.String(nullable: false, maxLength: 128),
blogID = c.String(nullable: false, maxLength: 128),
})
.PrimaryKey(t => new { t.tagID, t.blogID })
.ForeignKey("dbo.blogs", t => t.tagID, cascadeDelete: true)
.ForeignKey("dbo.tags", t => t.blogID, cascadeDelete: true)
.Index(t => t.tagID)
.Index(t => t.blogID);

 

 

收获园豆:20
indexlang | 菜鸟二级 |园豆:222 | 2016-08-03 20:20

非常感谢,已经查到了这个方案但竟然被我自己排除了,非常非常感谢。

linkFly | 园豆:91 (初学一级) | 2016-08-03 21:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册