使用Entity Framework&amp ;;在运行时更改数据库代码优先

时间:2011-09-09 16:15:33

标签: c# entity-framework code-first

有没有办法使用EF使用Code First方法改变底层数据库?

我有两个有静态模型的表: 用户和Info1。

我还有另一张表格,我打电话给info2。

我希望能够从我网站的管理部分添加和删除Info2中的列。

我的目标是建立一个可以随时动态更改的网站,添加和删除用户喜欢的字段,而无需用户了解编码。

我考虑过在我的MVC3项目模型中指定的数据库之外使用一个单独的数据库,而是直接执行SQL请求。

这也可以通过一个包含动态创建字段的表和另一个包含数据的表来实现,但这会很快变得混乱。

有人做过这样的事吗?这是个坏主意吗?

1 个答案:

答案 0 :(得分:0)

我建议尝试水平扩展表格,这是一个你应该有意识地做出决定的操作。

相反,我建议您将值存储为名称/值对。您可以拥有具有特定类型的表(假设您需要一个与键配对的整数值),然后您可以将这些类型选择为用户的字典。

如果您担心复制键值,您还会有一个包含键的表。

例如,您有一个UserDefinedKey

UserDefinedKeyId (int, PK)     Key (varchar(?))
--------------------------     ----------------
                         1     'My Website'
                         2     'My favorite color'

然后你会有一个UserDefinedString表(对于字符串值)

UserDefinedStringId  UserId     UserDefinedKeyId  Value
(int, PK)            (int, FK)  (int, FK)         (varchar(max))
-------------------  ---------  ----------------  --------------
                  1          1                 1  'http://stackoverflow.com'
                  2          1                 2  'Blue'
                  3          2                 2  'Red'

您可能希望在UserIdUserDefinedKeyId字段上放置一个唯一索引,以防止人们为同一个密钥输入多个值(如果您需要,可以使用单独的表没有唯一约束。)

然后,当您想为用户添加值时,将其添加到UserDefinedKey表中,然后将该逻辑从该表和其他保存值的表中移除。

垂直存储值的另一个好处是,您不会为所有用户未使用的值的列浪费空间。

例如,假设您采用修改表的方法,对于上面的属性,您将得到:

UserId  WebSite                   Color
------  -------                   -----
     1  http://stackoverflow.com  Blue
     2  (null)                    Red

现在让我们说第三个用户出现,并添加Favorite Sports Team值,他们是唯一使用它的人,表格如下:

UserId  WebSite                   Color  FavoriteSportsTeam
------  -------                   -----  ------------------
     1  http://stackoverflow.com  Blue   (null)
     2  (null)                    Red    (null)
     3  (null)                    (null) Yankees

随着用户和属性数量的增加,您拥有的稀疏数据量将大幅增加。

现在,假设您使用的是SQL Server 2008,可以使用sparse columns,如果不这样做,您的表格会变得庞大但数据不会很多。

此外,使用稀疏列并没有消除使用data definition language (DDL)动态更改架构非常脏的事实。

此外,实体框架无法使其对象模型适应新属性;每次添加属性时,都必须将属性添加到对象模型,重新编译和重新部署。

采用垂直方法,需要花费更多的工作,但它将具有无限灵活性,并且可以更有效地利用您的数据库空间。