ASP.NET MVC справочные таблицы в Linq to SQL - PullRequest
3 голосов
/ 18 октября 2010

Это действительно архитектурный вопрос.Я чувствую, что поступаю неправильно, и хотел получить информацию о лучших практиках.

Допустим, у меня есть таблица Transactions и таблица TransactionTypes.Представления отправят соответствующие данные транзакции, которые обрабатываются в моем контроллере.Проблема в том, что логика в контроллере может быть немного сложной, и TransactionType не предоставляется входами представления, а вычисляется в контроллере.(Это может быть частью моей проблемы).

Например, предположим, что представление отправляет ViewModel, который будет отображаться в TransactionType типа «Withdrawal».Тем не менее, контроллер обнаруживает, что ему необходимо изменить это на овердрафт ", так как средств недостаточно. То, что я не хочу сделать, это:

transaction.TypeId =
    DataContext.TransactionTypes.Single(x => x.type == "Overdraft").id;

..... так как я буду встраивать строковые литералы в мой код. Верно?

ОК, поэтому я могу сопоставить значения со строгими типами, которые позволили бы мне сделать это:

class TranTypes
{
   public const long Deposit = 1;
   public const long Withdrawal = 2;
   public const long Overdraft = 3;
}

...

transaction.TypeId =
    DataContext.TransactionTypes.Single(x => x.id == TranTypes.Overdraft);

Теперь, если мои поиски меняются в БД, у меня есть одно место, где я могу обновить сопоставления, и мои контроллеры все еще имеют представление о модели.

Но это чувствуетсятоже неловко.

Мне кажется, что я действительно хочу, чтобы автоматическое генерирование кода Linq To SQL могло генерировать ассоциацию, чтобы я мог просто ссылаться на строго типизированные имена (Deposit, Withdrawal и Draft) и будьте уверены, что он всегда будет возвращать текущие значения для них в базе данных. Изменения, внесенные в таблицу поиска во время выполнения, могут привести к проблемам, но все равно она выглядит намного чище.

Что я должен перевариватьчтобы понять, как бЕсть смысл структурировать это?

Заранее спасибо за расширение моего мозга.: -)

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

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

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

1 голос
/ 18 октября 2010

Один простой подход, который мне всегда нравился, - это подход Enum.

public enum TransactionType {
 Overdraft
}

transaction.TypeId =
    DataContext.TransactionTypes.Single(x => x.type == TransactionType.Overdraft.ToString()).id;

Это довольно просто, но мне это нравится.

Более сложный подход (не уверен, что это работает с Linq to SQL, но более сложные ORM поддерживают его (например, EF, DO .NET, LLBLGen и т. Д.) - это использовать наследование в вашей модели данных с дискриминаторами.

То есть иметь подкласс TransactionType, называемый OverdraftTransactionType, с дискриминатором (ключом), который идентифицирует различные типы TransactionTypes друг от друга.

Случайная ссылка: http://weblogs.asp.net/zeeshanhirani/archive/2008/08/16/single-table-inheritance-in-entity-framework.aspx

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