0

ここ数日、私は自分で作成したカスタム データ アクセス レイヤーの代わりに Entity Framework を使用するように、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; }
}

注: これは、これらのテクノロジを使用して練習するための単なる模擬プロジェクトです。

4

2 に答える 2

1

最も簡単な方法は、 Entity Framework Power Toolsをダウンロードしてインストールし、POCO を使用してデータベースを Code First モデルにリバース エンジニアリングすることです。シンプルで簡単、約2分かかります。

唯一の欠点 (私はそうは思いません) は、EFPT が、属性を使用するのではなく、モデルを完全に流暢に構成されたモデルに逆にすることです。私は属性が好きではないので、私にとっては問題ありません。

于 2013-06-11T14:39:57.740 に答える
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

于 2013-06-11T14:42:22.040 に答える