何度か読んで、私が質問を正しくするのが苦手だということがわかりました。質問にいくつかの修正を加えました。
アプリに と の 2 つのクラスがContractor
ありContractorGroup
ます。
それぞれ
Contractor
に親がありContractor
ます。親Contractor
は、その依存関係のみを表示できます。そして、その従属の従属を見ることはできません。1 レベルのみの可視性。親
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
)。
この場合、次のようなクエリを実行できます。ContractorGroup
Contractor
var ContractorGroupsToDispalayForParentContractor =
context.ContractorGroups.Where(p => p.Contractors.All(p => p.Parent == ParentContractor));
つまり、「親 == ParentContractor を持つ請負業者で構成されるすべてのグループを検索する」
このオプションでは、すべて正常に機能します。DbSchema は単純明快です。しかし、私はクエリが好きではありません。
2 番目:または、FK( VisibleToContractorId
) を導入できます。したがって、1 つの親には、依存関係で構成されるContractor
多くの親があります。次に、より単純で堅牢なクエリがあります。ContractorGroups
Contractors
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のバグですか?ドメイン モデルのどの実装を優先しますか?
ありがとう。