1

最近、ASP.NET プロジェクト内で Entity Framework を使い始めたばかりです (これも最近使い始めたばかりなので、最近は少し圧倒されています)。

4 つのルックアップ テーブルを持つデータベースがあります。ADO.Net エンティティを自分の asp.net プロジェクトに追加したとき、最初はルックアップ テーブルがなくなった理由に戸惑いました。いくつか調べた後、私はこれに出くわしました:

Entity Framework ルックアップ テーブル

そして、他の列を持たないルックアップテーブルではなく、外部キーが多対多の関係になることに気付きました。それはすべて順調です。ここで単純なものが欠けている可能性がありますが、おそらくそうであると思いますが、検索テーブルを走査して検索するのに最初は問題がなかったデータを照会する方法がわかりません。

これは私のデータベースの一般的なモデルです(EDMではありません)

人物: PID

グループ: GID

要件: RID

アクション: AID

個人/グループ: PID GID

グループ/要件: GID RID

要件/アクション: RID AID

人物/行動: PID AID

したがって、Person、Group、Requirement、および Action 間の多対多の関係により、ASP.Net Web フォーム プロジェクト コード内でステートメントを作成して、ルックアップ テーブルで使用していたように関係をトラバースする方法がわかりません。

以前は、PID = "目的の人物の ID" である Person/Group をクエリし、GID を使用して Group/Requirement からすべての RID を検索できました。次に、RID を使用して、要件/アクションからすべての AID を見つけます。次に、これらの AID を、AID が一致した Person/Action 内のすべての AID と比較して、要件が満たされているかどうかを確認します。

これがASP.NETの基本的なものであり、私が見落としていると言われても侮辱されることはありませんが、ここで質問して回答された場合、SQLクエリからエンティティに切り替える人には少なくとも簡潔な回答があると思いましたフレームワーク。

4

3 に答える 3

1

Person オブジェクトを取得するたびに、Actions と Groups のプロパティがあります。

グループにも Requirement プロパティが必要です。

だから、あなたが探しているのは次のようなものだと思います

list<int> personIds = {1,2,3};
List<Requirement> requirements = dbContext.Groups.Where(x => x.Person.Count(y => personIds.Contains(y.PersonId) > 0).Select(x => x.Requirements);
List<Action> actions = requirements.Actions;

私が EF で働いていたときはいつも一種の苦痛だった多対多のリレーションシップ シップです。

于 2013-03-29T20:41:35.513 に答える
1

EntityFramework では、「ナビゲーション プロパティ」と呼ばれるものを追加するオプションがあります。たとえば、架空の Person クラスのコード スニペットを見てみましょう。

1 : 1 または 1 : 1 の観点からは多数

public class Person
{
  public virtual Group Group {get;set;}
}

Many : Many または 1 : Many の観点から

public class Person
{
  public virtual ICollection<Group> Groups {get;set;}
}

多対多の関係の場合、EntityFramework FluentAPIを使用して、Person クラスと Group クラスの間の関係を設定します。1対1または1対多の場合、FluentAPI、DataAnnotationsを使用するか、EntityFrameworkに推測させることができます(PropertyName_IDを推測すると思います)。

プロパティ宣言のは、コンテキストを照会するときではなく、実際にコレクションを使用するときに、virtualEntityFramework がコレクションを遅延読み込みできるようにすることを意味します。virtual キーワードを使用せずにナビゲーション プロパティを宣言できますが、遅延ロードはできません。

これが、エンティティの操作を理解するのに役立つことを願っています。EntityFramework がどのように動作するかをさらに理解するために、Google で検索する必要があると思われるいくつかの用語を太字にしました。

特定の人物のグループに必要なすべてのアクションを取得するという質問から:

var requiredActions = myPerson.Groups.SelectMany(x => x.Requirements).SelectMany(x => x.Actions);

アクションを実行した人は次のようになります。

var performedActions = myPerson.Actions;

これらの行はどちらも、適切なナビゲーション プロパティが設定されていることを前提としています。

于 2013-03-29T20:44:53.720 に答える
0

前に述べたように、多対多の関連付けでは、エンティティ内にコレクション プロパティがあります。PersonhaveGroupsGroupwill have を持っていPersonsます。

のようなクエリを作成すると

db.Persons.Where(p => p.PID == 1).SelectMany(p => p.Groups)

You will get all groups of Person1. EF は、Person/Groupジャンクション テーブルを 2 回結合するクエリを作成します。

包括的な (または「クエリ」) 構文の方が適している場合があります。

from p in db.Persons
from g in p.Groups
where p.PID == 1
select g

あなたのケースは、おそらく次のようなクエリで解決できます。

from p in db.Persons
from g in p.Groups
from r in g.Requirements
from ra in r.Actions
from pa in p.Actions
where p.PID == 1
where ra.AID == pa.AID
select new { <properties from entities above> }

しかし、あなたの質問からは本当にわかりません。ただし、これは要点を理解するのに役立ちます。

于 2013-03-29T21:14:31.053 に答える