0

私は Database First EF5 で最初のステップを実行しており、EF5 ORM パラダイムでクラシックからの知識を再現しようとしていますが、行き詰まっています:DataTableDataAdapter

私はよく と を使って作業し、それらDataGridsViewsTreesで埋めていましたStored Procedures。表示に使用する情報は、複数のテーブル/エンティティに対応しています。

例えばブログアプリだとします。次のような投稿、ユーザーなど:

テーブル:

  • Post {Id, Subject, Body, Date, Author}
  • User {Id, Name, Email, Pwd}

そして、すべてのテーブルを結合し、いくつかの値を計算するために、 がありStoredProcedureます。この SP はPostUserテーブルと 2 つのランタイム計算値から属性を返します。

  • Post.Subject, Post.Body, Post.Categories, User.Name, DaysSincePublished, IsAuthorOnline

または、簡単にするために:

  • Post.*, User.*, DaysSincePublished, IsAuthorOnline

質問:

  • 以前のレコード セットを一度に複数のエンティティに適合させることは可能ですか (PostおよびUser)? そして、それを DataGridView で埋めますか?
  • オンザフライで作成されたエンティティに適合させることは可能ですか? その場合、DataGridView から更新 (バインド) することは可能ですか。
  • 私は問題に対して間違ったアプローチをしていますか?

Context.ObjectContext.Translate<TEntity>()orのようなメソッドを試しContext.Database.SqlQuery<TEntity>(storedProcedure, parameterArray);ましたが、一度に 1 つのエンティティしか返されません。

注: この例では、 を忘れてクエリStoredProcedureを作成することができます。linqしかし、実際のシナリオでは、10 を超えるテーブルとサブクエリを使用するクエリがあり、FK を使用しない場合が数回あります...そしてサーバーのパフォーマンスを気にするストアド プロシージャは必須です。

4

1 に答える 1

1

とにかく、あなたの質問はかなり漠然としています...

EF のような ORM を正しく使用するには、オブジェクトの世界よりも SQL の世界を理解することが良いことだと思います。

したがって、テーブルに対応する 2 つのクラスがあるとします。

Code First や Model First ではなく、Database first を使用することになると思います。

EF を使用する場合、クラスはデータベースから生成されます。

そんな感じ :

public partial class Post {
   public int Id {get;set;}
   public string Subject  {get;set;}
   public string Body {get;set;}
   public DateTime Date {get;set;}
   //etc.
   public virtual User Author {get;set;} //this is what's called a Navigation proeprty, which will help you to find relations with your User class.
}

public partial class User {
   public int Id {get;set;}
   public string Name {get;set;

   public IList<Post> Posts {get;set;}//Navigation property from User to Post class. It's a list, reflecting the one-to-many from Post to User.
}

計算されたプロパティについては、いくつかの方法でこれを行うことができます。

1 つは、部分クラス Post の別の部分を作成することです。

public partial class Post {
  public int DaysSincePublished {get {return (DateTime.Now - Date).Days;}}
}

次に、そのような単純なクエリを使用して、

public DbSet<User> Users {get;set;}
public DbSet<Post> Posts {get;set;}

それで

var myQuery = context.Users.Include(m => m.Posts);

var list = myQuery.ToList();//this will get data from your db.

リストには、「計算されたプロパティ」を含む、必要なすべてのフィールドがあります (実際には、Post と User からすべて取得していますが、これは実際に必要なものを超えている可能性があります)。

すべてを取得しないようにするには、匿名型 (またはカスタム クラス) で選択データを使用できます。

var myQuery = context.Posts.Select(m => new  {
   subject = m.Subject,
   body = m.Body,
   userName = m.User.Name,
   daysSincePublished = SqlFunctions.DiffDays(m.Date, DateTime.Now)//see another way to get calculated value
 });

var list = myQuery.ToList()//retrieving only the required fields from db.

そして、「私の本当のニーズはORMには複雑すぎる」という議論はあまり意味がありません. とにかく、必要に応じて SP を使用したり、生の SQL を使用したりすることができます。目標はあまりにも実用的ですが、決定的な結論に達する前に少し調査してください;)

于 2013-02-01T18:29:33.320 に答える