如何从 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
             });
    });