[英]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字段而不是字符串使用int
或Guid
。 如果要具有唯一的標識字符串,則將它們添加為附加列/ w唯一約束。 使用數字或UUID鍵是“無意義的鍵”的一種形式,它節省了索引空間,並使修改值更容易,而不必擔心意外更改/使數據關系無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.