Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 联接标识表和数据表MVC5 EF6_C#_Asp.net Mvc_Entity Framework_Linq_Asp.net Identity - Fatal编程技术网

C# 联接标识表和数据表MVC5 EF6

C# 联接标识表和数据表MVC5 EF6,c#,asp.net-mvc,entity-framework,linq,asp.net-identity,C#,Asp.net Mvc,Entity Framework,Linq,Asp.net Identity,我的数据表是由经过身份验证的用户编写的文章列表 在索引页面上,我想显示一个文章列表以及每个文章的作者姓名。问题是DisplayName存储在我的applicationDBContext标识表中,而我的数据存储在DBContext(我服务器上的独立数据库)中。两个表上都有唯一的USERID键,Identity表上有iD,Data表上有Author iD。我尝试过不同的技巧,给出了不同的错误,最常见的是 “指定的LINQ表达式包含对与不同上下文关联的查询的引用” 生成该错误的代码如下所示: var

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

在索引页面上,我想显示一个文章列表以及每个文章的作者姓名。问题是DisplayName存储在我的applicationDBContext标识表中,而我的数据存储在DBContext(我服务器上的独立数据库)中。两个表上都有唯一的USERID键,Identity表上有iD,Data表上有Author 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();
数据数据库上的数据表中的db.Articles和IDdb.Users是(标识数据库上的)用户表。我可以编写一个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);

有人能提出一种仍然有一定效率的方法吗?我找到了一种让它工作的方法,但它需要大量的代码,而且会影响性能。

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


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

string query=(@)从文章a中选择一个.*,usr.DisplayName作为'DisplayName'
在上加入identitytablename.dbo.AspNetUsers usr
datatable.Id=a.authorid“;
IEnumerable results=db.Database.SqlQuery(查询);

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

最简单的方法可能是在“articles”数据库中创建一个视图,以获取您的用户信息,然后将该视图连接到您的articles表(可能通过另一个视图)。然后您只需要查询文章DbContext。我正在尝试这样做,但它会给我一条消息“无法创建类型为“Project.ViewModels.UserDisplayNameVM”的常量值。此上下文中仅支持基本类型或枚举类型。”。仍然试图通过“视图”找到解决方案,我指的是一个,而不是一个视图模型。我知道我可以很容易地做到这一点。我不想这样设置我的web应用。在这种情况下,您可以使用带有EF6 ref:的SQL视图,但限制是一个视图只能用于一个联接查询。
    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);