我的数据表是由经过身份验证的用户编写的文章列表。
在索引页面上,我想显示一个文章列表以及每个文章的作者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);
任何人都可以提出一种方法来做到这一点仍然有效吗?我发现了一种方法可以使它工作,但它需要大量的代码并且真的会伤害性能。
答案 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?