MVCパターンのモデルデザインに問題があり、静的型のC#でスタックされています。LINQモデルの一般化
私がやりたいことは、すべてのデータベースの挿入、更新、削除操作を行うクラスのグループを作ることです。このグループは、データベースの各テーブルからマップされるクラスのサブグループと、テーブルクラスにアクセスするテーブルモデルクラスのサブグループで構成されます。
私はテーブルクラスを作成するために、LINQのマッピングを使用しています。何の問題もなく正常に動作します
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq;
using Iris.Models.Tables;
using Iris.Models.DataContexts;
namespace Iris.Models
{
public class UserModel
{
private UserDataContext dataContext;
private Table<Users> users;
public UserModel()
{
this.dataContext = new UserDataContext(Config.CONNECTION_STRING);
this.users = this.dataContext.GetTable<Users>();
}
public List<Users> Select()
{
var data = from user in this.users select user;
return data.ToList<Users>();
}
public Users Select(object id)
{
var data = from user in this.users where user.User_Id.ToString() == id.ToString() select user;
return data.ToList<Users>()[0];
}
public void Insert (Users user)
{
this.dataContext.Users.InsertOnSubmit(user);
this.dataContext.SubmitChanges();
}
public void Update(Users user)
{
var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;
var editedData = queryableData.Single<Users>();
editedData.User_Id = user.User_Id;
editedData.Name = user.Name;
editedData.Password = user.Password;
editedData.Userlevel_Id = user.Userlevel_Id;
this.dataContext.SubmitChanges();
}
public void Delete(Users user)
{
var queryableData = from row in this.dataContext.Users where row.User_Id == user.User_Id select row;
var deletedData = queryableData.Single<Users>();
this.dataContext.Users.DeleteOnSubmit(deletedData);
this.dataContext.SubmitChanges();
}
}
}
コードの組を超えるが、私がしたい:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Linq.Mapping;
using Iris.Libraries;
namespace Iris.Models.Tables
{
[Table]
public class Users
{
[Column(IsPrimaryKey = true)]
public string User_Id;
[Column]
public string Name;
[Column]
public string Password;
[Column]
public int Userlevel_Id;
public Users()
{
}
}
}
その後、モデルクラスによってアクセステーブルをデータベースにテーブルがたくさんあるので、モデルクラスの 'ほぼ同じ'コードを何度も書くのを避けるためです。その目的を達成するために、私はモデルの一般化されたクラスとそれから拡張されたすべてのテーブルモデルを作成しようとします。
public class Users : Model {}
問題は、各テーブルには常に異なる表<内のクラス>は
private Table<Users> users;
から来ています。私は数日間捜し求めていましたが、この問題を解決するための答えは見つかりませんでした。
上記のようなテーブルモデルを一般化することは本当に不可能ですか?あるいは同じコードを繰り返し書くことを避けるための他の方法がありますか?誰もが、私を助けてください.. :(
おそらくあなたは[リポジトリパターン](HTTPを探している「それは我々が自分自身を設計されたデータベースだ、それは近い将来に多くのことをするつもりの変更はありません」 .com/eaaCatalog/repository.html)。 – Steven
これはDataContextメソッドへのショートカットです。同じことを行うためにDataContextにいくつかの汎用メソッドを追加することができます。難しいのは、インターフェースの主キーを統一し、更新のためにエンティティをDataContextに再接続することです。 @Stevenが提案したように、リポジトリパターンを使用しているORMでもっと幸せになれます。 – Guillaume86