加入身份表和数据表MVC5 EF6

时间:2018-01-18 05:05:44

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

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

在索引页面上,我想显示一个文章列表以及每个文章的作者DisplayName。问题是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是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);

任何人都可以提出一种方法来做到这一点仍然有效吗?我发现了一种方法可以使它工作,但它需要大量的代码并且真的会伤害性能。

2 个答案:

答案 0 :(得分:0)

我找到了一种方法来做到这一点。只要您只查看数据而不更改数据,它就可以正常工作。我找到了答案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类型和名称与查询表名称和类型的结果匹配,就可以正常工作

答案 1 :(得分:-2)

此处的方法之一是,您可以对用户和文章使用相同的上下文。如下面的链接。

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