在过去的几天里,我一直在重构和使用C#编写的现有应用程序来使用Entity Framework而不是我制作的自定义数据访问层。一切顺利,直到我遇到一个特定的POCO。
这个POCO有6个属性,其中4个是基本类型,但最后2个给我带来麻烦,因为它们是其他现有的POCO。这给我带来麻烦的原因是因为在尝试使用Entity Framework访问我的数据库时,使用Linq to Entity无法正常工作。
给出错误:“执行命令定义时发生错误。有关详细信息,请参阅内部异常。” InnerException:“InnerException = {”无效的列名'Course_CourseId'。\ r \ n无效的列名'Student_StudentId'。\ r \ n无效的列名'Staff_StaffId'。“}”
我的数据库结构是:
UniversityCatalog
Table: Courses
-Field: CourseId (Guid)
-Field: CourseName (String)
-Field: CourseNumber (String)
-Field: Comments (String)
-Field: CreditHours (int)
-Field: CourseTypeId (int) (ForeignKey: CourseTypes.CourseTypeId)
Table: CourseTypes
-Field: CourseTypeId (int)
-Field: CourseTypeName (String)
Table: Staffs
-Field: StaffId (Guid)
-Field: FirstName (String)
-Field: LastName (String)
-Field: EmployeeId (int)
Table: Students
-Field: StudentId (Guid)
-Field: FirstName (String)
-Field: LastName (String)
-Field: Grade (String)
Table: CourseOfferings
-Field: CourseOfferingId (Guid)
-Field: CourseId (Guid) (ForeignKey: Courses.CourseId)
-Field: StaffId (Guid) (ForeignKey: Staffs.StaffId)
-Field: Start Time (String)
-Field: End Time (String)
-Field: DayOfWeek (String)
Table: CourseRegistrations
-Field: CourseOfferingId (ForeignKey: CourseOfferings.CourseOfferingId)
-Field: StudentId (ForeignKey: Students.StudentId)
我在CourseOfferings表中的POCO是:
public class CourseOffering
{
public Guid CourseOfferingId { get; set; }
public String DayOfWeek { get; set; }
public String StartTime { get; set; }
public String EndTime { get; set; }
public Course Course { get; set; }
public Student Student { get; set; }
public Staff Staff { get; set; }
}
我怀疑我必须在我的上下文文件中做一些自定义映射,但是我不知道我要做什么。任何提示或指针都会对我有所帮助!谢谢!
(这里也是我的上下文文件:)
class GatewayContext: DbContext
{
public DbSet<Course> Course { get; set; }
public DbSet<CourseType> CourseTypes { get; set; }
public DbSet<CourseOffering> CourseOfferings { get; set; }
public DbSet<Staff> Staff { get; set; }
public DbSet<Student> Students { get; set; }
}
注意:这只是一个使用这些技术练习的模拟项目
答案 0 :(得分:1)
最简单的方法是下载并安装Entity Framework Power Tools,然后将数据库反向工程为带有POCO的Code First模型。简单,轻松,大约需要2分钟。
唯一的缺点(我不这么认为)是EFPT将您的模型转换为完全流畅的配置模型,而不是使用属性。我不喜欢属性,所以对我来说没问题。
答案 1 :(得分:1)
我认为问题可能出在您对其他实体的导航属性上。您可能需要包含virtual关键字以允许实体框架使用代理覆盖这些属性,以便您可以将它们作为外键访问。
public class CourseOffering
{
public Guid CourseOfferingId { get; set; }
public String DayOfWeek { get; set; }
public String StartTime { get; set; }
public String EndTime { get; set; }
public Guid CourseId { get; set; }
public Guid StudentId { get; set; }
public Guid StaffId { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
public virtual Staff Staff { get; set; }
}
另一方面,我发现您可能无法将Guid用作主键字段。