【问题标题】:How to use Entity Framework with an existing Database and Poco Structure如何将实体框架与现有数据库和 Poco 结构一起使用
【发布时间】:2013-06-11 14:31:53
【问题描述】:

在过去的几天里,我一直在重组并使用 C# 编写的现有应用程序,以使用实体框架而不是我制作的自定义数据访问层。一切都很顺利,直到我遇到了一个特定的 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; }
}

注意:这只是一个模拟项目,用于练习使用这些技术

【问题讨论】:

  • “无法正常工作”没有帮助。请务必发布实际的编译错误消息/运行时异常。
  • 是的,对不起,我忘了包括那个。我已经用错误消息和异常更新了问题。

标签: c# entity-framework database-design poco


【解决方案1】:

最简单的方法是下载并安装Entity Framework Power Tools,然后只需将您的数据库反向工程为带有 POCO 的 Code First 模型。简单,轻松,大约需要 2 分钟。

唯一的缺点(我不这么认为)是 EFPT 将您的模型反转为完全流畅的配置模型,而不是使用属性。不过我不喜欢属性,所以对我来说没问题。

【讨论】:

  • 这是一个可能的解决方案,但我想尽可能避免使用电动工具生成代码。我目前正在尝试学习如何手动执行此操作,因为我是该框架的新手,而且我通常会像这样选择最好的东西。不过还是谢谢你的回答!
  • @NightW。 - 使用 Power 工具,您可以查看代码并了解它在做什么。
  • 是的,虽然它对我帮助不大。不过,我遇到的另一个问题是,分配给我模拟项目的那个人说要尽可能多地离开 POCO。虽然我不完全确定他为什么这么说。在之前的代码中,它们被用作传输对象。
【解决方案2】:

我认为问题可能出在您对其他实体的导航属性上。您可能需要包含 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

【讨论】:

  • 进行此更改会导致“InnerException = {"Invalid column name 'StudentId'."}”的内部异常。如果是这样,它会影响我的其他 POCO 吗?他们都使用 Guid 作为主要,不是吗?
  • 您是否尝试先使用代码?如果您有一个现有的数据库,那么我将基于它创建一个 EF 模型并查看它创建的属性。如果它仍然无法正常工作,那么您可以在以下演示中添加代码以使其正常工作geekswithblogs.net/danemorgridge/archive/2010/02/12/…
  • 我想我得尝试一下。
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2017-03-23
  • 2012-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2013-11-03
  • 1970-01-01
相关资源
最近更新 更多