我有一个Dbcontext,在它的OnModelCreating()方法中,我有如下所示:
modelBuilder.Entity<CmsContentData>().HasMany<CmsKeyword>(m =>
m.CmsKeywords).WithMany(m => m.CmsContentDatas).Map(m =>
{
m.ToTable("CmsContentData_CmsKeywords");
m.MapLeftKey("CmsContentDataID");
m.MapRightKey("CmsKeywordID");
});我想读CmsContentData_CmsKeywords表,但我想知道怎么读?(项目解决方案中没有CmsContentData_CmsKeywords模型)
发布于 2018-07-25 08:39:43
显然,您设计了一个多到多的关系:每个CmsContentData都有零或更多的CmsKeyWords,每个CmsKeyword都是由零或更多的CmsContentData使用的。
在关系数据库中,这种多到多的关系是使用连接表实现的。这张表是您在DbContext.OnModelCreating中提到的。
您是对的,您不会将这个连接表作为DbSet添加到您的DbContext中。你的课程将是:
class CmsContentData
{
public int Id {get; set;}
// every CmsContentData has zero or more CmsKeyWords (many-to-many)
virtual ICollection<CmsKeyWord> CmsKeyWords {get; set;}
... // other properties
}
class CmsKeyWord
{
public int Id {get; set;}
// every CmsKeyWord is used by zero or more CmsContentData (many-to-many)
virtual ICollection<CmsContentData> CmsContentData{get; set;}
... // other properties
}
class MyDbContext : Dbcontext
{
public DbSet<CmsContentData> CmsContentData {get; set;}
public DbSet<CmsKeyWord> CmsKeyWords {get; set;}
}这是实体框架需要知道的一切,以检测您设计了多到多的关系。它将为您和连接表创建两个表,即使没有OnModelCreating中的代码。
只有当您对表和列的默认标识符不满意时,您才需要OnModelCreating中的代码。
但是如果我没有对连接表的引用,我如何进行连接呢?
答:不要(分组)加入,使用ICollections
示例:获取一些包含所有(或部分) CmsContentData的CmsKeyWords:
var result = dbContext.CmsContextData
.Where(cmsContextData => ...) // only take certain cmsContextData
.Select(cmsContextData => new // only select properties you plan to use:
{
Id = cmsContextData.Id,
Name = cmsContextData.Name,
...
Keywords = cmsContextData.CmsKeywords
.Where(keyWord => keyWord.StartsWith(...)) // only select certain keywords
.Select(keyWord => new // only select properties you plan to use
{
Id = keyword.Id,
Text = keyWord.Text,
...
})
.ToList(),
});实体框架()足够聪明地检测到(组-)与两个表的连接,并且需要连接表。
相反的情况是:
选择使用某些特定CmsContentData的所有(或某些) CmsKeyWords:
var result = dbContext.CmsKeyWords
.Where(keyWord => keyWord.StartsWith(...) // take only certain keywords
.Select(keyword => new // select only the properties you plan to use
{
Text = keyWord.Text,
...
CmsContextData = keyWord.CmsContextData // I only want specific context data
.Where(contextData => ...) // that use this Keyword
.select(contextData => new
{
... // ContextData properties you plan to use
});
});https://stackoverflow.com/questions/51510994
复制相似问题