簡體   English   中英

使用Entity Framework從多個表中檢索數據

[英]Retrieving data from multiple tables using Entity Framework

我想基於每個表的itemId從多個表中獲取數據。

當前,我有一個帶有ItemId列的項目表,該列與另一個稱為ExplicitMods表具有1:m的關系:

namespace Poe.Models
{
    public class Item
    {
        [Key]
        public string ItemId { get; set; }
        public List<ExplicitMod> ExplicitMods { get; set; }
    }
}

namespace Poe.Models
{
    public class ExplicitMod       
    {
        public ExplicitMod(string Name)
        {
            this.Name = Name;
        }

        [Key]
        public string ItemId { get; set; } 
        public string Name { get; set; }
    }
}

我還建立了兩個表的上下文:

namespace Poe.DataAccess
{
    public class DatabaseContext : DbContext
    {
        public DbSet<Item> Items { get; set; }
        public DbSet<ExplicitMod> ExplicitMod { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
        }
    }
}

然后,我嘗試調用項目表,搜索名為“ Brood Star”的隨機名稱,然后加入explicitMod表:

public static void Search()
{
    //return FindItems(i);
    using (var db = new DatabaseContext())
    {
        var blogs = db.Items
                    .Where(b => b.Name.Equals("Brood Star"))
                    .Include(es => es.ExplicitMods).ToList();
        Debug.Write(blogs);
    }
}

我應該怎么做才能得到一張桌子的結果?

我也收到此錯誤:

System.Data.SqlClient.SqlException:'無效的對象名稱'ExplicitMod'

您的參考資料需要一些調整。 對於一對多,您的ExplicitMod將需要它自己的PK和FK到Item:

public class ExplicitMod       
{
    public ExplicitMod()
    {}

    public ExplicitMod(string name)
    {
        Name = name;
    }

    [Key]
    public string ExplicitModId { get; set; } 
    [ForeignKey("Item")]
    public string ItemId{ get; set; }
    public string Name { get; set; }
    public virtual Item Item { get; set; }
}

我相信它也將需要EF的無參數構造函數來即時構建它們。 您可能可以使用受保護的或私有的構造函數。

對於項目:

public class Item
{
   [Key]
    public string ItemId { get; set; }
    public virtual ICollection<ExplicitMod> ExplicitMods { get; private set; } = new List<ExplicitMod>();
}

建議初始化集合並使用私有設置器,以節省創建要填充的新實體時的步驟,並使外部代碼將集合引用設置為新的,未跟蹤的實體集。 (對於單元測試,我通常將設置器標記為內部,以允許單元測試設置存根)

我強烈建議為PK / FK字段而不是字符串使用intGuid 如果要具有唯一的標識字符串,則將它們添加為附加列/ w唯一約束。 使用數字或UUID鍵是“無意義的鍵”的一種形式,它節省了索引空間,並使修改值更容易,而不必擔心意外更改/使數據關系無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM