ef 6.x中的多对多映射是直接使用hasmany-hasmany来做的。但是到了ef core中,不再直接支持这种方式了,可以是可以使用,但是不推荐,具体使用可以参考《你必须掌握的entityframework 6.x与core 2.0》一文。在这里我就详细的说下如何在ef core下实现。
首先就是实体类的建立:
public class post
{
public int postid { get; set; }
public string title { get; set; } public icollectionposttags { get; } = new list ();
} public class tag
{
public int tagid { get; set; }
public string text { get; set; } public icollectionposttags { get; } = new list ();
} public class posttag
{
public int postid { get; set; }
public post post { get; set; } public int tagid { get; set; }
public tag tag { get; set; }
}
接下来就是映射了。派生自dbcontext的上下文类:
public class mycontext : dbcontext
{
public dbsetposts { get; set; }
public dbsettags { get; set; } protected override void onconfiguring(dbcontextoptionsbuilder optionsbuilder)
=> optionsbuilder.usesqlserver(
@"server=(localdb)\mssqllocaldb;database=test;connectretrycount=0"); protected override void onmodelcreating(modelbuilder modelbuilder)
{
modelbuilder.entity().totable("posttags");
modelbuilder.entity()
.haskey(t => new { t.postid, t.tagid });
}
}
这样就完成了我们的多对多映射了。我们只是通过多建立了一个表,将两个实体类的id作为联合主键。
在identity框架中,如果你细心点,你会发现有个userroles表,这个表是就是用来做users表和roles表的映射的。那么接下来我们只要新建一个实体类,随后在上下文类中映射到表:
modelbuilder.entity.totable("userroles");
这样就可以了。然后我们就可以很方便的给用户添加角色了。
参考链接:https://blog.oneunicorn.com/2017/09/25/many-to-many-relationships-in-ef-core-2-0-part-1-the-basics/