首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从mvc c#中用ModelBuilder映射的表中读取

问如何从mvc c#中用ModelBuilder映射的表中读取
EN

Stack Overflow用户
提问于 2018-07-25 04:48:19
回答 1查看 402关注 0票数 0

我有一个Dbcontext,在它的OnModelCreating()方法中,我有如下所示:

代码语言:javascript
复制
     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模型)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-25 08:39:43

显然,您设计了一个多到多的关系:每个CmsContentData都有零或更多的CmsKeyWords,每个CmsKeyword都是由零或更多的CmsContentData使用的。

在关系数据库中,这种多到多的关系是使用连接表实现的。这张表是您在DbContext.OnModelCreating中提到的。

您是对的,您不会将这个连接表作为DbSet添加到您的DbContext中。你的课程将是:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
             });
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51510994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档