linq to sql: 在Entityfamework Core中使用多個DbContext

最近在學習DotNetCore並做一個自己的小項目,分爲了多個數據庫,AccountDbContext和BlogDbContext,
發blog的時候需要用到Account的信息,但是再Blog中只記錄了UserID,然後用到了如下代碼:

var q = from u in this.DbAccount.Users
        join p in this.DbBlog.Posts
        on u.UserID equals p.UserID
        select u;
var v = q.FirstOrDefault();

但是目前來說貌似不支持,通過各種搜索,倒是有一個改xml的方案,但是我的項目的DbContext是手寫而不是使用SqlMetal工具生成的。報錯部分信息如下

"Microsoft.EntityFrame
workCore.Query","queryModel":"(from User u in DbSet<User> join Post p in DbSet<Post> on [u].UserID equals [p].UserID select [u]).F..."}}}}
'q.FirstOrDefault()' threw an exception of type 'System.ArgumentNullException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2147467261
    HelpLink: null
    InnerException: null
    Message: "Value cannot be null.\r\nParameter name: entityType"
    ParamName: "entityType"
    Source: "Microsoft.EntityFrameworkCore.Relational"
    StackTrace: "   at Microsoft.EntityFrameworkCore.Utilities.Check.NotNull[T](T value, String parameterName)\r\n   at Microsoft.EntityFrameworkCore.RelationalMetadataExtensions.Relational(IEntityType entityType)\r\n   at Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.RelationalEntityQueryableExpressionVisitor.VisitEntityQueryable(Type elementType)

但是在同一個server上誇數據庫的查詢再sqlserver和mysql都是支持的。也就是說EFCore 2.0現在不支持,現在臨時的解決方案如下,


            var userID = this.User.GetUserID();

            var queryUsers = from u in this.DbAccount.Users.Include(a => a.Account)
                             where u.UserID == userID
                             select new
                             {
                                 UserID = u.UserID,
                                 UserNickName = u.NickName
                             };
            var queryPosts = from p in this.DbBlog.Posts.Include(a => a.Tags)
                             join pc in this.DbBlog.PostContents
                             on p.PostID equals pc.PostID
                             orderby pc.CreateAt descending
                             where p.UserID == userID
                             select new
                             {
                                 PostID = p.PostID,
                                 UserID = p.UserID,
                                 Title = p.Title,
                                 URL = p.URL,
                                 Summary = p.Summary,
                                 Tags = p.Tags,
                                 EditorType = pc.EditorType,
                                 MD5Hash = pc.MD5Hash,
                                 Content = pc.Content,
                                 ContentCreateAt = pc.CreateAt
                             };

            var queryPo = from u in queryUsers.ToList()
                          join p in queryPosts.ToList()
                          on u.UserID equals p.UserID
                          orderby p.ContentCreateAt
                          select new
                          {
                              UserNickName = u.UserNickName,
                              Title = p.Title
                          };

            var pa = queryPo.ToList();

測試通過,但是要麻煩多了,就看EFCore什麼時候能原生支持了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章