我有一个EntiyFramework项目,我将设置存储在表格中。
该设置支持不同的类型,但最终将设置存储在字符串中,并转换为特定类型(GUID,字符串,TimeSpan等)。
一切正常,我只想查一下:
有没有更好的方法在表格中存储应用程序设置(我可以有多个公司,每个公司有不同的设置)?
如果设置(例如'default_reply_type',类型为GUID)引用数据库中的另一个对象主键怎么办?
可能会有一些像这样的设置引用其他对象,这可能在将来增加。
我很欣赏架构中没有明确的引用整合检查,但我可以手动实现这一点作为业务逻辑的一部分 - 这是好的还是讨厌的软糖?
此致
克里斯
代码如下。
public abstract class Setting
{
[Key, Column(Order = 0)]
public string SettingName { get; set; }
[Key, Column(Order = 1)]
public Guid CompanyID { get; set; }
public virtual Company Company { get; set; }
public string SettingValue { get; set; }
public string Description { get; set; }
public virtual void ConvertToType(string value, ref object outvalue)
{
outvalue = Convert.ChangeType(value, outvalue.GetType());
}
public virtual string ConvertToString(object value, Type type)
{
return Convert.ChangeType(value, typeof(string)).ToString();
}
public DateTime? UpdatedDateUTC { get; set; }
}
public class StringSetting : Setting
{
// no need for any overrides as string is base type
}
public class TimeSpanSetting : Setting
{
public override void ConvertToType(string value, ref object outvalue)
{
TimeSpan ts = new TimeSpan(Convert.ToInt64(value));
outvalue = ts;
}
public override string ConvertToString(object value, Type type)
{
if(type != typeof(TimeSpan))
throw new InvalidCastException(); // throw an error!
return ((TimeSpan)value).Ticks.ToString();
}
}
答案 0 :(得分:1)
我对此的建议如下:
在SQL中使用uniqueidentifier类型表示Guids。使用SQL中的bigint类型表示TimeSpans并存储刻度。
如果uniqueidentifier类型用于非主键列,请考虑使用CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000')将列的默认值设置为空GUID,而不是允许NULL值。
在将uniqueidentifier用作主键之前,请查看该文档。应用程序和数据库设计人员必须注意其使用的一些具体注意事项。 SQL Server联机丛书主题Using uniqueidentifier Data是一个很好的起点。
如果将uniqueidentifier用于主键,请考虑将列默认设置为NEWSEQUENTIALID()或NEWID()。前者通常是首选。
外键有助于SQL优化器决定一些事情,所以如果可能的话,最好有它们,但有时候没有简单的方法可以用这种方式来联系。
您应该尝试避免使用多列主键,因为它们可能会引入一系列问题,其中一个问题是设计架构的脆弱性,另一个问题是索引和搜索成本更高。
回答您的问题1:存储具有多个变体的设置信息的一种可能方法是将设置存储在xml列中。见xml (Transact-SQL)。实际上,您甚至可以使用XmlSerializer将对象存储在数据库中(请参阅XmlSerializer Class),这使得内容非常易读。如有必要,还可以直接在SQL中从xml序列化对象中提取信息(参见xml Data Type Methods)。
回答你的问题2:你可以设计xml存储的设置,使其不需要引用。除此之外,如果它不是主键,请确保包含Guid的列已编入索引,并确保彻底查看我之前引用的uniqueidentifier信息,以便您了解选择使用Guid /的影响,性能和其他方面唯一标识符