C#设置引用其他表EntityFramework中其他实体的PK ID
本文关键字:其他 实体 PK ID EntityFramework 设置 引用 | 更新日期: 2023-09-27 18:22:00
我有一个EntiyFramework项目,我将其设置存储在一个表中。
该设置支持不同的类型,但最终将设置存储在字符串中,并转换为特定类型(GUID、字符串、TimeSpan等)。
一切正常,我只想检查一下:
-
有没有更好的方法将应用程序设置存储在表中(我可以有多个公司,每个公司都有不同的设置)?
-
如果一个设置(例如"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();
}
}
我自己对此的建议如下:
在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的影响、性能和其他方面。