0

我有 3 个实体 -Direction -City -GeoPosition

每个方向都有一个地理位置,每个城市都有一个地理位置的集合(这代表一个多边形)

我有 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)。

实体框架允许您通过 DML 或存储过程插入/更新/删除,但它不允许您选择“两者”。如果您要使用存储过程路由,则必须为框架可能需要对实体(包括关系表)进行的各种数据修改提供过程。

于 2009-06-10T15:00:26.400 回答
1

几天来,我一直在绞尽脑汁在 Interwebz 上搜索有关如何使用实体框架 (EF) 将数据插入数据库交叉表的信息。我访问了所有主要玩家的网站和博客,但没有人提供关于如何执行此操作的简单语法。出乎意料的是,我想到了答案,我有义务并决心与尽可能多的人分享这个问题,以减轻我所经历的痛苦。

让我们设置舞台。假设我们有这样的数据库关系:

学生 (StudentID(PK)、StudentName、Gender)
课程 (CourseID(PK)、CourseName、CourseDescription)
StudentsCourses (StudentID(PK, FK), CourseID(PK, FK))

对于那些对 EF 足够熟悉的人,您知道当将上述关系转换为实体数据模型时,Students 和 Courses 表被创建为实体,但 StudentsCourses 表不是。这是因为StudentCourses表除了其他两个表的键之外不包含任何属性,所以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/many-to-many-mappings-in-entity-framework.aspx

现在让我们假设您想为当前学生 (ID:123456) 注册本学期的新课程(ENGL101、SOC102 和 PHY100)。在这种情况下,我们希望使用 Student 表和 Courses 表中的现有信息将新记录插入到 StudentsCourses 表中。使用这些表中的任何一个表中的数据都很容易,因为它们都是模型中的实体,但是您不能直接访问 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();
}

因为关联是双向的,所以可以按道理检索三个 Course 对象(通过 CourseID)并将相同的 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 回答