[英]Entity Framework with composite key of foreign keys error
我對實體框架有點陌生。 我有一個類定義如下,對應於一個數據庫表,該表具有由兩列組成的復合外鍵: GroupID
和CompanyID
,以及名為RegionID
的第三個外鍵:
[Table("GroupMembers")]
public class GroupMember
{
[Key, ForeignKey("GroupID"), Column(Order = 1)]
public int GroupCompanyID { get; set; }
[Key, ForeignKey("CompanyID"), Column(Order = 2)]
public int MemberCompanyID { get; set; }
[Column("MemberCode")]
public string MemberCompanyCode { get; set; }
[Column("RegionID")]
public int RegionId { get; set; }
}
我嘗試下面的查詢檢索MemberCode
當我對值GroupID
和MemberCompanyID
:
var GroupMember = await repository.GroupMembers
.FirstOrDefaultAsync(x => x.MemberID == memberId &&
x.CompanyID == manufacturerId);
我收到以下異常:
無法將屬性“GroupID”配置為導航屬性。 該屬性必須是有效的實體類型,並且該屬性應具有非抽象的 getter 和 setter。 對於集合屬性,該類型必須實現 ICollection,其中 T 是有效的實體類型
我想我在OnModelCreating
方法中遺漏了一些東西,我嘗試了以下但沒有用:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<GroupMember>()
.HasKey(gm => new {gm.GroupID, gm.MemberID});
}
還有一點要注意的是,這兩個GroupID
和MemberID
他們都指向同一個主鍵列,被稱為OrganizationID
在一個名為表Organizations
,只是不同的價值觀。 我不確定這是否會影響任何事情。
任何人都可以指出我正確的方向嗎? 謝謝!
該代碼有點令人困惑,我不確定它是如何編譯的。 :) 我的想法是你會尋找更像的東西:
[Table("GroupMembers")]
public class GroupMember
{
[Key, ForeignKey("Group"), Column(Order = 1)]
public int GroupCompanyID { get; set; }
[Key, ForeignKey("Company"), Column(Order = 2)]
public int MemberCompanyID { get; set; }
[Column("MemberCode")]
public string MemberCompanyCode { get; set; }
[Column("RegionID")]
public int RegionId { get; set; }
public virtual Company Company { get; set; }
public virtual Group Group { get; set; }
}
[Table("Companies")]
public class Company
{
[Key]
public int CompanyID { get; set; }
public string Name { get; set; }
// ...
}
[Table("Groups")]
public class Group
{
[Key]
public int GroupID { get; set; }
// ...
}
導航屬性指向相關實體,EF 會將它們連接起來,以便您可以加載它們的數據並通過這些屬性引用它們。
延遲加載:(小心,因為這可能意味着針對 DB 運行的額外查詢)
var groupMember = context.GroupMembers.FirstOrDefault(x => x.RegionId == 4);
var companyName = groupMember.Company.Name; // Context will check if the company is loaded and load it if needed.
急切加載:
var groupMember = context.GroupMembers
.Include(x => x.Company)
.Include(x => x.Group)
.FirstOrDefault(x => x.RegionId == 4);
var companyName = groupMember.Company.Name; // Member's company (and group) already loaded above.
選擇地圖:(匿名類型示例)
var groupMemberDetails = context.GroupMembers
.Where(x=> x.RegionId == 4)
.Select(x => new
{
x.GroupId,
x.CompanyId,
x.RegionId,
CompanyName = x.Company.Name
}).FirstOrDefault();
Select 可用於填充 ViewModel 或 DTO 之類的內容,這是利用 EF 的非常強大的選項,而不會引發延遲加載調用的風險。 這種方法的優點是發送到數據庫的查詢只返回填充數據所需的字段,而不是實體和相關導航屬性中的所有內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.