Как настроить свойство из 1 linq2sql obj, которое заполняется отношением к другому obj - PullRequest
0 голосов
/ 07 апреля 2009

Я использую Linq2SQL, и я довольно новичок в этом.

У меня есть таблица User и таблица UserData, идея в том, что свойства объекта User можно добавлять / удалять, добавляя или удаляя строки в таблице UserData. Я не придумал этот конкретный дизайн, но я более или менее застрял с ним (пока я могу придумать решение)

альтернативный текст http://www.86th.org/linq2sqlproblem.jpg

Я бы хотел заполнить / связать «FirstName» объекта User чем-то вроде установки значения:


UserData.Value WHERE UserData.ItemID == User.UserID AND KeyName = 'FirstName'

Аналогично, LastName будет:


UserData.Value WHERE UserData.ItemID == User.UserID AND KeyName = 'LastName'

Описание таблицы пользовательских данных:

  • UserData.ItemID - это FK (User.UserID)
  • UserData.KeyName указывает имя свойства
  • UserData.Value - фактическое значение.

Как мне настроить мой объект User для обработки этого, чтобы я мог выполнять обычные функции CRUD для этого объекта и переносить изменения в обе таблицы?

Это вообще возможно?

Это плохая форма?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2009

Лично я чувствую его плохую форму, но я полагаю, что у всех есть способ делать вещи. Почему вы не можете назначить данные пользователя в таблице пользователей? Я думаю, что, возможно, я не понимаю идею дизайна здесь.

0 голосов
/ 07 апреля 2009

Краткое примечание

Я переименовал UserData в ExtendedProperty , и это привело к тому, что отношение от Пользователь к ExtendedProperty было названо ExtendedProperties .

Сводка изменений

  1. Создан метод получения / установки для FirstName и LastName в части Пользователь class
  2. Получил правильный элемент ExtendedProperty из коллекции ExtendedProperties и возвратил или обновил его свойство Value .
  3. Преобразован в формат многократного использования, как показано ниже
partial class User
{
    public string FirstName
    {
        get { return (string)this.getExtendedProperty("FirstName").Value; }
        set { this.getExtendedProperty("FirstName").Value = value; }
    }

    public string LastName
    {
        get { return (string)this.getExtendedProperty("LastName").Value; }
        set { this.getExtendedProperty("LastName").Value = value; }
    }

    // Grab a related property out of the collection, any changes to it will be reflected in the database after a submit
    private ExtendedProperty getExtendedProperty(string KeyName)
    {
        // grab the properties that fit the criterea
        var properties = (from prop in this.ExtendedProperties where prop.KeyName == KeyName select prop);

        // return value
        ExtendedProperty property = properties.SingleOrDefault();

        // if this is a new user then there arent going to be any properties that match
        if (property == null)
        {
            // Define a new item to add to the collection
            property = new ExtendedProperty()
            {
                ItemID = this.UserID,
                KeyName = KeyName,
                Value = String.Empty
            };

            // Add the item we're about to return to the collection
            this.ExtendedProperties.Add(property);
        }

        // either way we have a valid property to return at this point
        return property;
    }
}

Я просто надеюсь, что это не раздутый / крайне неэффективный.

Редактировать

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

User expected = new User();
expected.UserID = Guid.NewGuid();
expected.UserName = "LJ";
expected.FirstName = "Leeroy";  // It would error here
expected.LastName = "Jenkins";

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

Я также удалил setExtendedProperty , поскольку я чувствовал, что в этом нет необходимости, и в любом случае это был всего лишь метод с 1 вкладышем.

Буду очень признателен за любой отзыв, прежде чем принять этот ответ, я оставлю его на несколько дней.

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