1


何度か読んで、私が質問を正しくするのが苦手だということがわかりました。質問にいくつかの修正を加えました。

アプリに と の 2 つのクラスがContractorありContractorGroupます。

  1. それぞれContractorに親がありContractorます。親Contractorは、その依存関係のみを表示できます。そして、その従属の従属を見ることはできません。1 レベルのみの可視性。

  2. Contractorは、依存関係を にグループ化できContractorsますContractorGroup

    Contractorsそのため、1 つContractorGroup(多対 1) に依存する多には、それが属するグループで
    Contractorある NavProperty があります。ContractorGroupそれぞれContractorが ONLY IN ONEContractorGroupです。

例: 私は親Contractorであり、5 つの依存関係がContractorsあり、そのうちの最初の 2 つを 1stContractorGroupに、最後の 3 つを 2ndにグループ化したいと考えていContractorGroupます。したがって、実装するオプション:

最初: 2 つのグループのそれぞれを parent に接続するFK(VisibleToContractorId-id of my parentContractor)。 この場合、次のようなクエリを実行できます。ContractorGroupContractor

    var ContractorGroupsToDispalayForParentContractor =
context.ContractorGroups.Where(p => p.Contractors.All(p => p.Parent == ParentContractor));

つまり、「親 == ParentContractor を持つ請負業者で構成されるすべてのグループを検索する」
このオプションでは、すべて正常に機能します。DbSchema は単純明快です。しかし、私はクエリが好きではありません。

2 番目:または、FK( VisibleToContractorId) を導入できます。したがって、1 つの親には、依存関係で構成されるContractor多くの親があります。次に、より単純で堅牢なクエリがあります。ContractorGroupsContractors

    var ContractorGroupsToDispalayForParentContractor = 
context.ContractorGroups.Where(p => p.VisibleToContractor == ParentContractor);

このクエリは私が好きです。しかし、EF は ALWAYS である奇妙な DbColumn を導入しnullます。>:-E

短いデータベース スキーマ:

Table("Contractor")
ContractorId = PK
ContractorGroupId = FK
ContractorGroup_ContractorGroupId = FK <--- This One

Table("ContratorGroup")
ContractorGroupId = PK
VisibleToContractorId = FK

私のドメイン クラスと EntityConfiguration:

public class Contractor : IObjectWithState
{
    [Key]
    public virtual int ContractorId { get; set; }

    public virtual Contractor Parent { get; set; }
    public virtual int? ParentId { get; set; }

    public virtual ContractorGroup ContractorGroup { get; set; }
    public virtual int? ContractorGroupId { get; set; }

    public virtual ICollection<ContractorGroup> GroupsVisible { get; set; } 
 }

public class ContractorGroup : IObjectWithState
{
    [Key]
    public virtual int ContractorGroupId { get; set; }

    public virtual Contractor VisibleToContractor { get; set; }
    public virtual int? VisibleToContractorId { get; set; }

    public virtual ICollection<Contractor> Contractors { get; set; }            
}

エンティティ構成 ( のみContractorGroupConfiguration):

HasMany(p => p.Contractors).WithOptional(p=>p.ContractorGroup);
HasOptional(p => p.VisibleToContractor).WithMany(
       p=>p.GroupsVisible).HasForeignKey(p=>p.VisibleToContractorId);

EFのバグですか?ドメイン モデルのどの実装を優先しますか?

ありがとう。

4

1 に答える 1

0

ContractorGroup.VisibleToContractorポイントは、関連付けと が (2 つの FK フィールドを持つ) 独立した関連付けでContractor.GroupsVisibleはなく、双方向の関連付けの 2 つの部分であることを EF に伝える必要があるということです。エンティティ構成を次のように置き換えます。

class ContractorConfiguration : EntityTypeConfiguration<Contractor>
{
    public ContractorConfiguration()
    {
        HasMany(c => c.GroupsVisible).WithOptional(g => g.VisibleToContractor);
    }
}

これがないと、EF はフィールドContractorGroup_ContractorGroupIdを FK のContractor.GroupsVisible上にFK として作成しますVisibleToContractorId

于 2012-11-11T09:40:59.170 に答える