【问题标题】:Join Identity Table and Data Table MVC5 EF6加入身份表和数据表 MVC5 EF6
【发布时间】:2018-01-18 05:05:43
【问题描述】:

我的数据表是经过身份验证的用户撰写的文章列表。

在索引页面上,我想显示文章列表以及每篇文章的作者的 DisplayName。问题是 DisplayName 存储在我的 applicationDBContext 身份表中,而我的 Data 存储在 DBContext 中(我服务器上的单独数据库)。唯一的 USERID 键在两个表上,身份表上的 iD 和数据表上的作者 ID。我尝试了不同的方法,给出了不同的错误,最常见的错误是

“指定的 LINQ 表达式包含对与不同上下文关联的查询的引用”

产生该错误的代码如下:

var arts = (from a in db.Articles
                        join uid in iDdb.Users
                            on a.AuthorID equals uid.Id
                        select new ArticleVM
                   {
                       ID = a.ID,
                       ArticleTitle = a.ArticleTitle,
                       ArticleBody = a.ArticleBody.Substring(0, 200),
                       ArticleCategory = a.ArticleCategory,
                       DateCreated = a.DateCreated,
                       AuthorID = uid.DisplayName
                   }).AsEnumerable();

data 数据库上的 Data 表中的 db.Articles 和 IDdb.Users 是 User 表(在身份数据库上)。我可以编写一个 SQL 查询来生成我需要的东西,但是如何将这些数据放入 ViewModel 中,例如,这个 SQL 查询会给我我需要的东西:

var query = @"select artDB.*, usrDB.DisplayName from Article as artDB inner
                            join [IGTSIAppUsersTest1].dbo.AspNetUsers as usrDB on 
                            artDB.AuthorID = usrDB.Id order by artDB.ID Desc";
            var arts = db.Database.ExecuteSqlCommand(query);

任何人都可以提出一种仍然有效的方法吗?我找到了一种让它工作的方法,但它需要大量的代码并且真的会损害性能。

【问题讨论】:

  • 可能最简单的做法是在“文章”数据库中创建一个视图以提取您的用户信息,然后将该视图加入您的文章表(可能通过另一个视图)。然后你只需要查询文章 DbContext。
  • 我正在尝试这样做,但它给了我一条消息“无法创建类型为 'Project.ViewModels.UserDisplayNameVM' 的常量值。在此上下文中仅支持原始类型或枚举类型。 ”。仍在努力寻找解决方案
  • “视图”是指database view,而不是视图模型。

标签: c# asp.net-mvc entity-framework linq asp.net-identity


【解决方案1】:

我找到了一种方法来做到这一点。只要您只查看数据而不更改数据,它就可以工作。我找到了答案here

    string query = (@"select a.*, usr.DisplayName as 'DisplayName' from article a
join identitytablename.dbo.AspNetUsers usr on
datatable.Id = a.authorid");
            IEnumerable<ArticleIndexVM> results = db.Database.SqlQuery<IndexViewModel>(query);

只要您的 ViemModel 类型和名称与查询表名称和类型的结果匹配,就可以正常工作

【讨论】:

    【解决方案2】:

    这里的一种方法是,您可以对用户和文章使用相同的上下文。如下链接。

    Use the same database for both my custom entities and identity context?

    【讨论】:

    • 我知道我可以轻松做到这一点。我不想以这种方式设置我的网络应用程序。
    • 在这种情况下,您可以将 SQL 视图与 EF6 参考:stackoverflow.com/questions/7461265/… 一起使用,但限制是一个视图只能用于一个连接查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-02
    • 2015-10-14
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多