2013-06-11 34 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

我想我必須試驗一下。 –