2016-08-10 13 views
0

私はASP.NET MVCを使用してEFデータベースを使用してサイトを作成しています(このチュートリアルのすべてに従います:https://www.asp.net/mvc/overview/getting-started/database-first-development/creating-the-web-application)。C#Entity FrameworkデータベースFirst - 一部のフィールドのみを使用

問題は、インデックスビュー(レコードのリスト)で、エンティティからフィールドの1つを削除したいということです。私はそれをビューに隠しておきたいだけでなく、すべて一緒に削除します(問題は、それが非常に大きなチャンクを保持し、リストの読み込みが非常に遅くなります)。

「編集」ビューでは、すべてのフィールドを表示して使用します。

私はエンティティから一つのフィールドを削除した場合、私はこのエラーを取得する:

return View(db.XXX.ToList()); 

The entity type XXX is not part of the model for the current context.

私は何ができますか?

+1

エンティティからフィールドを削除する場合は、モデルのエンティティ全体ではなく、そのフィールドをエンティティから削除します。 – Antrim

+0

フィールドにIgnore Attributeを追加すると、EFはクエリでそれを使用したり、データでデータを入力したりしません。 –

+0

あなたの質問に答えることはできません。おそらく何の助けにもなりませんが、カスタムモデルが必要な場合は、まずDBをやっていますか?これは、コードの第1のアプローチで容易に達成可能である。 – Omeed

答えて

1

これについては、いくつかの方法があります。手元にある問題は.ToList()です。 db.XXXだけであれば、Enumerableを取得します.Enumerableは、列挙されるまで、DBからデータを取得するための一連の命令です。一度あなたが.ToList()を呼ぶと、それは実際に行き、DBからデータを取得します。これは時間がかかります。

私の意見では、大量のデータを持つフィールド以外のすべてのフィールドを含むViewModelを定義するのが最善の方法です。

public class ViewModel 
{ 
    public ViewModel(){} 
    public int Id {get;set;} 
    public string OtherData {get;set;} 
} 
ようにビュー機能の外 db.XXXを移動

var initialDBObject = db.XXX; 

をそこからあなたはまだあなたのDBからのデータにアクセスするための命令セットだけである(あなたの可算を取ることができます)及びそのようなあなたのViewModelオブジェクトにそれを選択します:あなたはLINQの後ろに生成するクエリを変更している。ここで何が起こっている

var viewModelObject = initialDBObject.Select(x=> new ViewModel 
    { 
     Id = x.Id; 
     OtherData = x.OtherData; 
     //do not add the large column of data to the ViewModel 
    }); 

)((ToListメソッドを呼び出す前)テーブルXXXからデータを取得するためのシーン(この行にブレークポイントを置き、initialDBObjectにカーソルを置くと、生成されるSQLが表示されます)。 ToList()を呼び出すと、クエリはテーブルXXXからデータを取得するだけでなく、データを取得して、.emmファイルで定義されているように、ViewModelオブジェクト(XXXオブジェクトではなく)に挿入します。

また

.Select(x=> new 
{ 
    Id, 
    OtherData 
}); 

と匿名のオブジェクトを作成しますが、ビューで動作するように匿名のオブジェクトを取得することは少し複雑であることができます。

次に、あなたではなく、元のDBオブジェクトのビューモデルを使用するようにインデックス表示ページを更新するために、あなたが好きそれを渡すことができます必要があります。

View(viewModelObject.ToList()); 

名前かかわらViewModelに、ほかのViewModel何か。 [DBテーブル名] ViewModelまたは同様のもの。

DBに多くの行がある場合は、すべてのデータをロードするのにまだ時間がかかります。この場合、ページングを調べる必要があります。

ToList()には問題はありません。ToList()は、ToList()の呼び出しによって発生しました。プログラム内のその時点でプログラムがデータベースにアクセスしているため、データを取得するために生成されたクエリ。テーブル全体のデータをToList()しようとしている場合、またはあなたの場合のように、膨大なデータを含む列を持つと、時間がかかるか、メモリ不足になる可能性があります。

.Select()に含める必要がある15個の列については、それは迷惑です。残念ながら、linq文でコンストラクタを使用することはできません。したがって、各列には強制的に値が設定されます。

ViewModelを定義するもう1つの方法は、.edmxデザインサーフェスを開き、背景を右クリックし、[新規作成 - >エンティティ]をクリックすることです。テーブルXXXをベースとして使用したり、XXXViewModelなどの別の名前を付けたり、大量のデータを含む列を削除したりすることができます。次に、db.XXXViewModel.ToList()を実行するだけです。

+0

ありがとうU RIanGillis! 2つの質問:1.私は本当にこの行を理解していない:initialDBObject.select(x =>新しいViewModel。選択の新しいビューモデルはありますか?2。私は約15のフィールドを持って、すべて選択に行く必要があります問題があるようです。 .. – webmobileDev

+0

また、私は問題をToListする理由を理解していませんか? – webmobileDev

+0

あなたの質問に答えるために答えを更新しました。 – RIanGillis

関連する問題