C#设置引用其他表EntityFramework中其他实体的PK ID

本文关键字:其他 实体 PK ID EntityFramework 设置 引用 | 更新日期: 2023-09-27 18:22:00

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

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

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

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

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

    在引用其他对象的情况下,可能会有一些类似的设置,而且这种设置将来可能会增加。

    我很感激在模式中没有明确的引用完整性检查,但我可以将其作为业务逻辑的一部分手动实现——这可以吗?

问候,

Chris

代码如下。

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#设置引用其他表EntityFramework中其他实体的PK ID

我自己对此的建议如下:

在SQL中用uniqueidentifier类型表示Guid。在SQL中用bigint类型表示TimeSpans并存储ticks。

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

在将uniqueidentifier用作主键之前,请查看有关它的SQL文档。对于它的使用,应用程序和数据库设计者必须注意一些具体的注意事项。SQL Server联机丛书主题"使用唯一标识符数据"是一个很好的起点。

如果主键使用uniqueidentifier,请考虑将列默认值设置为NEWSEQUENTIALID()或NEWID()。前者通常是首选。

外键有助于SQL优化器决定一些事情,所以如果可能的话,拥有它们是很好的,但有时没有简单的方法来以这种方式关联事情。

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

要回答您的问题1:存储具有多种变体的设置信息的一种可能方法是将设置存储在xml列中。请参阅xml(Transact-SQL)。事实上,您甚至可以使用XmlSerializer(请参见XmlSerializerClass)将对象存储在数据库中,这使内容具有相当的可读性。如果需要,还可以直接在SQL中从xml序列化对象中提取信息(请参见xml数据类型方法)。

为了回答您的问题2:您可以设计xml存储的设置,使其不需要引用。除此之外,如果包含Guid的列不是主键,请确保对其进行索引,并确保彻底查看我之前引用的uniqueidentifier信息,以便了解选择使用Guid/uniqueidentifiers的影响、性能和其他方面。