C#设置引用另一个表Entity Framework中其他实体的PK ID

时间:2012-02-01 00:09:35

标签: c# entity-framework settings

我有一个EntiyFramework项目,我将设置存储在表格中。

该设置支持不同的类型,但最终将设置存储在字符串中,并转换为特定类型(GUID,字符串,TimeSpan等)。

一切正常,我只想查一下:

  1. 有没有更好的方法在表格中存储应用程序设置(我可以有多个公司,每个公司有不同的设置)?

  2. 如果设置(例如'default_reply_type',类型为GUID)引用数据库中的另一个对象主键怎么办?

    可能会有一些像这样的设置引用其他对象,这可能在将来增加。

    我很欣赏架构中没有明确的引用整合检查,但我可以手动实现这一点作为业务逻辑的一部分 - 这是好的还是讨厌的软糖?

  3. 此致

    克里斯

    代码如下。

    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();
        }
    }
    

1 个答案:

答案 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 /的影响,性能和其他方面唯一标识符