2012-03-13 9 views
0

私のMVCサイトで教師ログインし、彼のクラスとそのクラスで使用されているすべての本を表示する必要があります。IIdentityを使用したMVCフィルタデータベース

教師は、他の誰かがクラスやブックを見ることができないようにすべきです。

は、ここで私はUnitOfWorkのでRepositoryPatternを使用し、私のモデル

public class Teacher 
{ 
    public int Id { get; set; } 

    public string Name {get; set;} 
} 

public class Books 
{ 
    public int Id {get; set;} 

    public string Title {get; set;} 

    public int CourseId {get; set;} 
} 

public class Course 
{ 
    public int Id {get; set;} 

    public int Name {get; set;} 

    public int TeacherId {get; set;} 
} 

です。

すべてのクラスが、私は私のコントローラでのラインのこの種を置くべきshowned戸部得るために:私はcurrentTeacherのすべてのクラスをチェックする必要があるため

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id) 

物事はBookControlerで最悪取得します:

var classes = classRepository.All.Where(x => x.TeacherId == currentTeacher.Id) 
var books = bookRepository.All.Where(x => classes.Contains(y => y.Id == x.CourseId) 

このようなアプローチは、機能的なバグにつながる可能性があります。

var classes = classRepository.All; // Already filtered on currentTeacher 

または

var books = bookRepository.All; // Already filtered on currentTeacher 
を:私がやりたいものを は先生が順番に私のリポジトリの自動フィルタをログインしたときので、私のコントローラで私が持っているだろう、currentTeacherについてのみ件のデータを維持するということです

これは可能ですか?そしてどうやって?

答えて

0

現在の認証済みユーザーに渡す新しいAll(IPrincipal user)メソッドを作成します。このAllメソッドは、オブジェクトコンテキストのTeacherコレクションのIdentity.Nameの値を検索してIDを取得し、それを返します。

つまり.Where(x => x.TeacherId == currentTeacher.Id)は、この新しいAllメソッドからの戻り値です。

+0

残念ながら、これは私のクラスで動作しません。救急隊 – user1012750

+0

何故ですか? – SilverlightFox

+0

申し訳ありません...私はclassRepositoryにチェックインする必要のあるBookリポジトリを意味しました。この場合、IIdentityでは不十分です。 私の本当の疑問は、教師をばらばらにしてデータベースをフィルタリングする方法はありますか?基本的にフィルタリングされたデータベースには、特定の教師に関連するデータのみが含まれます。 – user1012750

関連する問題