C # Настройки, относящиеся к PK ID другой сущности в другой таблице EntityFramework - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть проект 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();
    }
}

1 Ответ

1 голос
/ 01 февраля 2012

Мой собственный совет по этому поводу следующий:

Представляет Guids с типом uniqueidentifier в SQL. Представление TimeSpans с типом bigint в SQL и сохранение тиков.

Если тип уникального идентификатора используется для столбца без первичного ключа, рассмотрите возможность установки значения по умолчанию для столбца равным пустому GUID, используя CONVERT (uniqueidentifier, «00000000-0000-0000-0000-000000000000») вместо разрешения NULL значения.

Просмотрите документацию SQL на uniqueidentifier, прежде чем использовать его в качестве первичного ключа. Есть несколько конкретных предостережений при его использовании, о которых должны знать разработчики приложений и баз данных. Электронная документация по SQL Server Использование данных уникального идентификатора - хорошее место для начала.

Если для первичного ключа используется уникальный идентификатор, рассмотрите возможность установки для столбца по умолчанию значения NEWSEQUENTIALID () или NEWID (). Первый, как правило, является предпочтительным выбором.

Внешние ключи помогают оптимизатору SQL решать некоторые вещи, поэтому хорошо иметь их, если это возможно, но иногда просто не существует простого способа связать вещи таким образом.

Вам следует избегать многоколоночных первичных ключей, поскольку они могут создавать целый ряд проблем, одна из которых - хрупкость разработанной схемы, а другая заключается в том, что они более дороги для индексации и поиска.

Чтобы ответить на ваш вопрос 1. Один из возможных способов сохранить информацию о настройках, которая имеет несколько вариантов, - это сохранить настройки в столбце xml. См. xml (Transact-SQL) . На самом деле, вы даже можете хранить объекты в базе данных, используя XmlSerializer (см. XmlSerializer Class ), что делает контент довольно удобным для чтения человеком. Существуют также способы извлечения информации из сериализованных объектов xml непосредственно в SQL, если это необходимо (см. Методы типов xml ).

Чтобы ответить на ваш вопрос 2: Возможно, вы могли бы создать сохраненные настройки XML таким образом, чтобы они не нуждались в ссылке. За исключением этого, убедитесь, что ваш столбец, содержащий Guid, проиндексирован, если он не является первичным ключом, и убедитесь, что вы тщательно изучили информацию об уникальных идентификаторах, на которые я ссылался ранее, чтобы вы понимали влияние, производительность и другие способы выбора использования Guid /. UniqueIdentifier.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...