如何从 mvc c# 中使用 ModelBuilder 映射的 table 中读取
How to read from a table that is mapped with ModelBuilder in mvc c#
我有一个 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
table 但我不知道如何阅读?
(项目解决方案中没有CmsContentData_CmsKeywords
模型)
显然你设计了一个多对多关系:每个 CmsContentData
有零个或多个 CmsKeyWords
,每个 CmsKeyword
被零个或多个 CmsContentData
使用.
在关系数据库中,这种多对多关系是使用联结 table 实现的。这个 table 就是你在 DbContext.OnModelCreating
.
中提到的那个
您是对的,您不会将此联结 table 添加为 DbContext 中的 DbSet。您的 类 会像:
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;}
}
这是 Entity Framework 检测您设计的多对多关系所需知道的一切。它会为您和联结点 table 创建两个 table,即使您的代码不在 OnModelCreating 中也是如此。
只有当您对 table 和列的默认标识符不满意时,您才需要 OnModelCreating 中的代码。
但是如果我没有引用连接 table,我该如何连接?
回答:不要(组)加入,使用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(),
});
Entity Framework 足够聪明,可以检测到与您的两个 table 的(组)连接,并且需要连接点 table。
反过来:
Select 所有(或某些)使用某些特定 CmsKeyWords 的 CmsContentData:
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
});
});
我有一个 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
table 但我不知道如何阅读?
(项目解决方案中没有CmsContentData_CmsKeywords
模型)
显然你设计了一个多对多关系:每个 CmsContentData
有零个或多个 CmsKeyWords
,每个 CmsKeyword
被零个或多个 CmsContentData
使用.
在关系数据库中,这种多对多关系是使用联结 table 实现的。这个 table 就是你在 DbContext.OnModelCreating
.
您是对的,您不会将此联结 table 添加为 DbContext 中的 DbSet。您的 类 会像:
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;}
}
这是 Entity Framework 检测您设计的多对多关系所需知道的一切。它会为您和联结点 table 创建两个 table,即使您的代码不在 OnModelCreating 中也是如此。
只有当您对 table 和列的默认标识符不满意时,您才需要 OnModelCreating 中的代码。
但是如果我没有引用连接 table,我该如何连接?
回答:不要(组)加入,使用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(),
});
Entity Framework 足够聪明,可以检测到与您的两个 table 的(组)连接,并且需要连接点 table。
反过来:
Select 所有(或某些)使用某些特定 CmsKeyWords 的 CmsContentData:
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
});
});