簡體   English   中英

具有外鍵組合鍵錯誤的實體框架

[英]Entity Framework with composite key of foreign keys error

我對實體框架有點陌生。 我有一個類定義如下,對應於一個數據庫表,該表具有由兩列組成的復合外鍵: GroupIDCompanyID ,以及名為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當我對值GroupIDMemberCompanyID

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});            
}

還有一點要注意的是,這兩個GroupIDMemberID他們都指向同一個主鍵列,被稱為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.

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