Entity Framework 5でASP.NET MVC4を使用しています。
基本的に、すべてのコントローラー アクションの結果は、ログインしているユーザーの会社 ID によってデータベースの結果をフィルター処理します。コントローラーから DbContext を直接フィルタリングするのではなく、モデルを返すリポジトリ パターンの実装を開始したところです。(companyID をリポジトリに渡して、メソッドの結果をフィルタリングします)
これを行うのは悪い習慣であるというおかしな感じがありますが、この件に関する情報を見つけることができませんでした. 現在のコードの基本的なバージョンを以下に挿入します。それが悪い習慣であるかどうか、およびその理由についての情報をいただければ幸いです。
IBookingSystemRepository.cs
public interface IBookingSystemRepository : IDisposable
{
IEnumerable<Appointment> GetAppointments();
IEnumerable<Appointment> GetAppointments(bool includeDeleted);
IEnumerable<Client> GetClients();
IEnumerable<Client> GetClients(bool includeDeleted);
void Save();
}
BookingSystemRepository.cs
public class BookingSystemRepository : IBookingSystemRepository
{
private BookingSystemEntities db;
int CompanyID;
public BookingSystemRepository(BookingSystemEntities context, int companyID)
{
this.db = context;
this.CompanyID = companyID;
}
public IEnumerable<Appointment> GetAppointments()
{ return GetAppointments(false); }
public IEnumerable<Appointment> GetAppointments(bool includeDeleted)
{
return includeDeleted
? db.Appointments.Where(a => a.User.CompanyID == CompanyID)
: db.Appointments.Where(a => a.User.CompanyID == CompanyID && a.Deleted.HasValue);
}
public IEnumerable<Client> GetClients()
{ return GetClients(false); }
public IEnumerable<Client> GetClients(bool includeDeleted)
{
return includeDeleted
? db.Clients.Where(c => c.CompanyID == CompanyID)
: db.Clients.Where(c => c.CompanyID == CompanyID && c.Deleted.HasValue);
}
public void Save()
{
db.SaveChanges();
}
public void Dispose()
{
if (db != null)
db.Dispose();
}
}
TestController.cs
public class TestController : Controller
{
private BookingSystemEntities db = new BookingSystemEntities();
public ActionResult AppointmentsList()
{
var user = db.Users.Single(u => u.Email == User.Identity.Name);
IBookingSystemRepository rep = new BookingSystemRepository(db, user.CompanyID);
return View(rep.GetAppointments());
}
}
ご支援いただきありがとうございます:)