我在下班后的晚上构建这个应用程序,并且已经为这个设计问题苦苦挣扎了一两个星期。
我正在构建一个程序,它有 44 种不同类型的条目,并且需要能够创建自定义类型。
因为用户可能会更改特定类型条目中的字段和/或定义自己的字段,所以我为每种类型的条目生成实体类的第一种方法似乎不可行。如果用户更改任何字段或他们的架构版本(当然需要验证),那么我的课程不会真正反映这一点。
即使不允许用户更改字段,我也要确保数据架构更改不会对当前数据造成问题。
为了构建一个能够完成所有这些的模式,我做了以下工作:
类型
- ID
- 数据类型
场地
id 字段名
fieldDataType(通过外键链接到 dtype)
数据存储
- ID
- 数据文本
- 数据串
- 数据日期
- 数据双
- 数据整数
- fieldID(通过外键链接到字段)
- entryID(通过外键链接到条目的 id 字段)
类型 ol>id int
- 类型名称
- 字段
条目
- ID
- typeid(通过外键链接到类型的 id)
好吧,该模式非常非规范化但难以在 ASP.NET MVC 中使用。
我对它的第二次破解涉及创建一个具有类型属性的类来存储条目碰巧是哪种数据类型。
域级 公共类条目的自定义类 { 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 对象来映射编辑/创建。
想法?
罗恩