Проверять уникальные ключи с asp.net mvc и linq to sql? - PullRequest
2 голосов
/ 10 июня 2009

У меня есть таблица сервера sql с 2 полями, ID (первичный ключ) и Имя (уникальный ключ). Я использую linq to sql для создания объектов модели для asp.net MVC из этой таблицы.

Для проверки модели я реализовал IDateErrorInfo в частичном классе

public partial class Company : IDataErrorInfo
{
    private Dictionary<string, string> _errors = new Dictionary<string,string>();

    partial void OnNameChanging(string value)
    {
        if (value.Trim().Length == 0)
        {
            _errors.Add("Name", "Name is required");
            return;
        }
    }
}

Это работает, как ожидается, со свойством Model.IsValid и помощником Html.ValidationSummary.

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

Я мог бы просто вызвать метод AddCompany в моем хранилище и перехватить исключение SQLException, но это выглядит грязно.

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude="ID")] Company companyToCreate)
{
if (!ModelState.IsValid)
{
    return View();
}
//Add to the Database
try
{
    _companyRepos.AddCompany(companyToCreate);
    return RedirectToAction("Index");
}
catch(SQLException ex)
{
    return View("do something to show the error inserting");
}
}

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

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

Спасибо

Ответы [ 2 ]

2 голосов
/ 10 июня 2009

Одна из возможностей метода AddCompany - возвращать логическое значение, указывающее на успех или неудачу операции.

Однако обычно выявляется ошибка такого типа перед попыткой добавить запись. Положить

bool Exists(string companyName) 

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

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

1 голос
/ 10 июня 2009

Как бы вы ни разрезали его, вам, очевидно, придется попасть в базу данных, чтобы получить список имен, которые уже используются. Поэтому я бы предложил добавить в ваш репозиторий метод, который в основном просто возвращает IList или IEnumberale, который просто содержит все отдельные имена в этой таблице в БД. Затем в своем методе проверки просто используйте этот метод в хранилище, чтобы получить все уникальные имена, и выполните проверку там.

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