0

私は3つのエンティティを持っています - 方向 - 都市 - 地理位置

各方向には地理位置があり、各都市には地理位置のコレクションがあります (これはポリゴンを表します)。

私は5つのテーブルを持っています -directions -cities -geopositions -directionsgeopositions -citiesgeopositions

そしてEFエンティティはこれです

代替テキスト http://img192.imageshack.us/img192/5863/entitydesignerdiagram.png

各エンティティには、挿入、更新、および削除のための関数インポートがあります

私はこのエラーがあります

Error 2027: If an EntitySet or AssociationSet includes a function mapping, 
all related entity and AssociationSets in the EntityContainer must also define
 function mappings. The following sets require function mappings: CitiesGeopositions, DepartmentsGeopositions.  

リレーション テーブルの関数インポートが必要ですか??

何が問題ですか?

4

2 に答える 2

3

あなたの質問に対する答えは、それぞれ次のとおりです。

  1. はい。
  2. (1) を参照してください。

Entity Framework では、DML またはストアド プロシージャを介して挿入/更新/削除できますが、「両方」を選択することはできません。ストアド プロシージャ ルートに移動する場合は、フレームワークがエンティティに対して実行する必要がある可能性のあるあらゆる種類のデータ変更 (リレーション テーブルを含む) に対して、プロシージャを提供する必要があります。

于 2009-06-10T15:00:26.400 に答える
1

数日前から、Entity Framework (EF) を使用してデータベース交差テーブルにデータを挿入する方法について、Interwebz で情報を収集するために頭を悩ませています。私はすべての主要なプレーヤーの Web サイトとブログにアクセスしましたが、これを実行する方法に関する簡単な構文を提供した人はいません。突然、答えが私に浮かび、私が経験した痛みを軽減するために、これをできるだけ多くの人々と共有することを決意しました.

舞台を整えましょう。次のようなデータベース関係があるとします。

学生 (StudentID(PK), StudentName, Gender)
Courses (CourseID(PK), CourseName, CourseDescription)
StudentsCourses (StudentID(PK, FK), CourseID(PK, FK))

EF に精通している方は、上記のリレーションシップをエンティティ データ モデルに変換すると、Students テーブルと Courses テーブルはエンティティとして作成されますが、StudentCourses テーブルは作成されないことをご存知でしょう。これは、StudentCourses テーブルには他の 2 つのテーブルのキー以外の属性が含まれていないためです。したがって、EF は直接、Students と Courses の間の多対多の関係をマップします (EF は、この点でリレーショナル データベースの方法に制限されません)。 .) エンティティの代わりに、交差テーブルを AssociationSet に変換します。この動作を認識していない場合は、次のリンクで例を確認してください。

http://thedatafarm.com/blog/data-access/inserting-many-to-many-relationships-in-ef-with-or-without-a-join-entity/
http://weblogs.asp.net/ zeeshanhirani/archive/2008/08/21/多対多のエンティティのマッピング-framework.aspx

ここで、今学期の新しいコース (ENGL101、SOC102、および PHY100) に現在の学生 (ID:123456) を登録するとします。この場合、Students テーブルと Courses テーブルの既存の情報を使用して、StudentCourses テーブルに新しいレコードを挿入します。これらのテーブルはどちらもモデル内のエンティティであるため、どちらのテーブルのデータも簡単に操作できますが、StudentCourses テーブルはエンティティではないため、直接アクセスすることはできません。このジレンマの鍵は、各エンティティのナビゲーション プロパティにあります。Student エンティティには Course エンティティへのナビゲーション プロパティがあり、その逆もあります。これらを使用して、私が好きなように「関連付けの記録」を作成します。

既存の学生を既存のコースに関連付けるコード サンプルを次に示します。

using (var context = TheContext())
{
    Student st = context.Students.Where(s => s.StudentID == “123456”).First();
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “ENGL101”).First());
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “SOC102”).First());
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “PHY100”).First());

    context.Students.AddObject(st);
    context.SaveChanges();
}

関連付けは双方向であるため、(CourseID によって) 3 つの Course オブジェクトを取得し、同じ Student オブジェクトをそれぞれに関連付けることができますが、私自身はテストしていません。必要以上のコードになり、意味的に混乱する可能性があると思います。

新しい学生を同じ既存のコースに関連付けるコード サンプルを次に示します。

using (var context = TheContext())
{
    Student st = new Student({ StudentID = “654321”, StudentName = “Rudolph Reindeer”,
        Gender = “Male” });
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “ENGL101”).First());
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “SOC102”).First());
    st.Courses.Add(context.Courses.Where(c => c.CourseID == “PHY100”).First());

    context.Students.AddObject(st);
    context.SaveChanges();
}

最後に、新しい学生を新しいコースに関連付けるコードを次に示します (簡潔にするために「...」を使用)。

using (var context = TheContext())
{
    Student st = new Student({ ... });
    st.Courses.Add(new Course({ ... }));
    st.Courses.Add(new Course({ ... }));
    st.Courses.Add(new Course({ ... }));

    context.Students.AddObject(st);
    context.SaveChanges();
}
于 2011-05-15T20:57:26.870 に答える