私は仕事の後の夜にこのアプリを構築していますが、この設計上の問題に 1 週間か 2 週間苦労しています。
44 種類のエントリがあり、カスタム タイプを作成する機能を必要とするプログラムを構築しています。
ユーザーは特定の種類のエントリのフィールドを変更したり、独自のフィールドを定義したりする可能性があるため、エントリの種類ごとにエンティティ クラスを生成するという私の最初のアプローチはうまくいかないようです。ユーザーがいずれかのフィールドまたはスキーマのバージョンを変更した場合 (もちろん、検証の対象となります)、私のクラスは実際にはそれを反映しません。
ユーザーがフィールドを変更できない場合でも、データ スキーマの変更によって現在のデータに問題が生じないようにしたいと考えています。
これらすべてが可能なスキーマを構築するために、次のことを行いました。
dtype
- ID
- データ・タイプ
分野
id フィールド名
fieldDataType (外部キーによって dtype にリンク)
データストア
- ID
- データテキスト
- データ文字列
- データ日付
- データダブル
- dataInt
- fieldID (フィールドへの外部キーでリンク)
- entryID (外部キーによってエントリの id フィールドにリンク)
タイプ ol>id int
- タイプ名
- 田畑
エントリ
- ID
- typeid (外部キーによって型の id にリンク)
スキーマは非常に非正規化されていますが、ASP.NET MVC での操作は困難です。
私の 2 番目のクラックは、型指定されたプロパティを持つクラスを作成して、エントリがたまたまどのデータ型であるかを格納することでした。
ドメイン レベルのカスタム クラス public class entry { public List dataList = new List();
public entry(int id)
{
kleraDataContext s = new kleraDataContext();
var dataSet = s.dataStores.Where(c => c.citationID == id);
foreach (dataStore y in dataSet)
{
dataBlob tempd = new dataBlob();
//We get the data type id
var temp = s.fields.Where(c => c.id == y.fieldID).First();
//Get the fieldname and store the data type id for later
tempd.fieldname = temp.fieldName;
tempd.dataType = temp.dtype.dataType;
switch (tempd.dataType)
{
case "String":
tempd.dString = y.dataString;
break;
case "Text":
tempd.dString = y.dataText;
break;
default:
//Nothing
break;
}
this.dataList.Add(tempd);
}
}
}
public class dataBlob
{
private string _dString;
private DateTime _dDate;
private int _dInt;
private double _dDouble;
private object _data;
private string _fieldname;
private string _dataType;
public string dataType
{
get
{
return _dataType;
}
set
{
_dataType = value;
}
}
public object data
{
get
{
return _data;
}
}
public string dString
{
get
{
return _dString;
}
set
{
_dString = value;
_data = value;
}
}
public string fieldname
{
get
{
return _fieldname;
}
set
{
_fieldname = value;
}
}
public DateTime dDate
{
get
{
return _dDate;
}
set
{
_dDate = value;
_data = value;
}
}
public double dDouble
{
get
{
return _dDouble;
}
set
{
_dDouble = value;
_data = value;
}
}
public int dInt
{
get
{
return _dInt;
}
set
{
_dInt = value;
_data = value;
}
}
}
}
これにはいくつかの問題があることに注意してください。
- 物理構造内のフィールド タイプに関係なく、データを格納するのに十分な一般的なプロパティを取得するのに問題があります。理想的には、データのアクセサは、たまたまデータ型が何であれ取得するだけです。
- ASP.NET MVC のビューに一貫性のある十分なモデルを提供して、プレゼンテーション コードが解析を行う必要がないようにする十分な方法がまだありません。理想的には、ビューは、フィールドのリストとそれに対応するデータを含むオブジェクトを取得するだけです。
- #2に関連して、変更を永続化する適切な方法がわかりません。クエリを作成し、フィールドをビューに返すようにすることができます。各フィールドは厳密に型指定されたアクセサーではないため、ビューからモデルへの変更を保持する方法がわかりません。単純に、非表示のスパンにキーを挿入し、コントローラーで Dictionary オブジェクトを使用して編集/作成をマップすることを考えました。
考え?
ロン