2013-06-11 31 views
0

在过去的几天中,我一直在重构和现有的使用C#编写的应用程序,以使用实体框架而不是我自定义的数据访问层。一切都很顺利,直到遇到特定的POCO。如何在现有数据库和Poco结构中使用实体框架

这个POCO有6个属性,其中4个是基本类型,但是最后2个给我麻烦,因为它们是其他现有的POCO。这给我带来麻烦的原因是因为使用Linq to Entity在尝试使用Entity Framework访问我的数据库时无法正常工作。

给出的错误:“执行命令定义时发生错误,请参阅内部异常以了解详细信息。” 的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) 

的POCO我对CourseOfferings表是:

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

“无法正常工作”没有帮助。请张贴实际的编译错误消息/运行时异常。 – ken2k

+0

是的,抱歉,我忘了包括这一点。我用错误消息和异常更新了问题。 –

回答

1

最简单的方法是下载并安装Entity Framework Power Tools练习,然后就逆转使用POCO将数据库设计为Code First模型。简单,容易,大约需要2分钟。

唯一的缺点(我没有看到它)是EFPT将您的模型转换为完全流畅的配置模型,而不是使用属性。虽然我不喜欢属性,所以对我来说很好。

+0

这是一个可能的解决方案,但是如果可能的话,我想避免使用电源工具来生成代码。我目前正在尝试学习如何通过手工来完成这项工作,因为我对框架很陌生,通常我会选择最好的。尽管谢谢你的回答! –

+0

@NightW。 - 使用电动工具,你可以看看代码,看看它在做什么。 –

+0

是的,尽管它对我无能为力。然而,我与此有关的另一个问题是,那个指派我模拟项目的人说要专门离开POCO,因为他们尽可能多。虽然我不完全确定他为什么这么说。在之前的代码中,它们被用作传输对象。 –

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作为主键字段。

http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/37fd6405-3441-4b2b-82f6-266b79d86708

+0

进行此更改会导致出现“InnerException = {”列名'StudentId'。“}”无效的内部异常。如果是这样的话,它会影响我的其他POCO吗?他们都使用Guids作为初级,不是吗? –

+0

你想先使用代码吗?如果你有一个现有的数据库,那么我只需创建一个基于它的EF模型,并查看它创建的属性。如果它仍然无法正常工作,那么你可以在下面的演示中添加代码以使其运行起来http://geekswithblogs.net/danemorgridge/archive/2010/02/12/guids-as-primary-keys-with-entity-framework -4.aspx – Stokedout

+0

我想我必须试验一下。 –