【问题标题】:C# Settings referring to PK ID of other entity in other table EntityFrameworkC#设置引用另一个表实体框架中其他实体的PK ID
【发布时间】:2012-02-01 00:09:35
【问题描述】:

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

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

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

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

  2. 如果某个设置(例如“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();
    }
}

【问题讨论】:

    标签: c# entity-framework settings


    【解决方案1】:

    我自己的建议如下:

    在 SQL 中使用 uniqueidentifier 类型表示 Guid。用 SQL 中的 bigint 类型表示 TimeSpan 并存储刻度。

    如果 uniqueidentifier 类型用于非主键列,请考虑使用 CONVERT(uniqueidentifier, '00000000-0000-0000-0000-000000000000') 将该列的默认值设置为空 GUID,而不是允许NULL 值。

    在将 uniqueidentifier 用作主键之前,请查看有关 uniqueidentifier 的 SQL 文档。应用程序和数据库设计人员必须注意其使用的一些特定注意事项。 SQL Server 联机丛书主题Using uniqueidentifier Data 是一个很好的起点。

    如果唯一标识符用于主键,请考虑将列默认设置为 NEWSEQUENTIALID() 或 NEWID()。前者通常是首选。

    外键帮助 SQL 优化器决定一些事情,所以如果可能的话最好拥有它们,但有时很难以这种方式关联事情。

    您应该尽量避免使用多列主键,因为它们会带来一系列问题,其中一个是设计架构的脆弱性,另一个是索引和搜索成本更高。

    回答您的问题 1:存储具有多个变体的设置信息的一种可能方法是将设置存储在 xml 列中。见xml (Transact-SQL)。事实上,您甚至可以使用 XmlSerializer(请参阅XmlSerializer Class)将对象存储在数据库中,这使得内容非常易于阅读。如有必要,还有一些方法可以直接在 SQL 中从 xml 序列化对象中提取信息(参见xml Data Type Methods)。

    回答您的问题 2:您可以设计 xml 存储设置,使其不需要参考。除此之外,如果包含 Guid 的列不是主键,请确保它已被编入索引,并确保彻底查看我之前引用的有关唯一标识符的信息,以便了解选择使用 Guid/ 的影响、性能和其他方面唯一标识符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      相关资源
      最近更新 更多