1

我在下班后的晚上构建这个应用程序,并且已经为这个设计问题苦苦挣扎了一两个星期。

我正在构建一个程序,它有 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;
            }

        }
    }
}

请注意这方面的几个问题。

  1. 无论物理结构中的字段类型如何,我都无法获得足够通用的属性来存储数据。理想情况下,数据的访问器将只检索碰巧的数据类型。
  2. 我仍然没有足够好的方法来为 ASP.NET MVC 的视图提供足够连贯的模型,以便演示代码不必进行解析。理想情况下,视图将只获得一个包含字段列表及其相应数据的对象。
  3. 与#2 相关,我似乎无法找到一种适当的方式来持久化更改。可以编写查询并让它将字段返回到视图。因为每个字段都不是强类型访问器,所以我不确定如何将更改从视图持久化到模型。天真地,我想过在隐藏的跨度中插入一个键,并在控制器中使用 Dictionary 对象来映射编辑/创建。

想法?

罗恩

4

1 回答 1

1

虽然我不确定你的最终目标,但我可能有一个选择。您需要一个高度动态的“实体”,它允许您的用户创建自己的数据结构。像 C# 这样的命令式语言不适合这样的事情......即使使用动态语言,我认为您也可能会遇到一些困难。然而,XML 是一种以特别的、运行时可创建的方式表示动态数据结构的极好方式。

如果您使用的是 SQL Server,我建议您创建一个更简单的类型,如下所示,并将其存储在一个表中,其中一个列使用“xml”数据类型:

public class DynamicEntity
{
    public int ID { get; set; }
    public string TypeName { get; set; }
    public XDocument DynamicContent { get; set; }
}

上述实体可以存储在下表中:

CREATE TABLE DynamicEntity
(
    ID int IDENTITY(1,1) NOT NULL,
    NAME varchar(50) NOT NULL,
    DynamicContent xml NULL
)

鉴于 SQL Server 的 xml 功能,您仍然可以查询该 xml 列中的数据。不仅如此,如果您希望您的用户自定义结构根据架构进行验证,您还可以将该架构放入数据库中并针对该架构“键入”您的 xml 列。在 SQL Server 中使用 XML 列确实有一些注意事项,但它可能是解决您原本复杂的问题的简单解决方案。

于 2009-05-31T05:41:03.773 回答