Modelbinder создает ненужные внешние отношения .. как решить? - PullRequest
0 голосов
/ 23 июля 2010

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

В моем представлении создания у меня есть,

<%= Html.LabelFor(p => p.Manufacturer.Name) %>
<%= Html.EditorFor(p => p.Manufacturer.Name) %>

В действии создания,

public ActionResult Create(Product product) {
    if (product.Manufacturer != null && 
        !String.IsNullOrEmpty(produnt.Manufacturer.Name) && 
        !String.IsNullOrWhiteSpace(produnt.Manufacturer.Name)) {
        Manufacturer manufacturer = _session.Single<Manufacturer>(m => m.Name.Equals(produnt.Manufacturer.Name));

        if (manufacturer == null) {
            _session.Add(product.Manufacturer);
        }
        product.Manufacturer = manufacturer;
    }
    _session.Add(product);
}

В таблице производителей у меня просто есть столбцы ID и Name. Имя установлено в NOT NULL. Каждый продукт имеет идентификатор производителя, который может быть НЕДЕЙСТВИТЕЛЕН. Я добавил отношение FK от Manufacturer.ID <=> Product.ManufacturerID.

Я также установил в качестве значения по умолчанию Product.ManufacturerID значение null, используя аннотацию данных DefaultValue с метаданными модели.

Это прекрасно работает, когда я указываю производителя при создании продукта. Но когда я оставляю это поле пустым, в базе данных назначается идентификатор для Product.ManufacturerID, но с этим идентификатором не создается производитель. Отладчик показал, что Product.Manufacturer.Name имеет значение null, но по некоторым причинам Product.Manufacturer.ID и Product.ManufacturerID установлены в 0 (не нуль). Как я могу сделать так, чтобы он оставлял Product.ManufacturerID нулевым, если не указан ни один производитель?

Было бы лучше отсоединить сущность «Производитель» и сделать действие похожим на это,

public ActionResult Create(Product product, Manufacturer manufacturer) {
    // ...
}

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

1 Ответ

0 голосов
/ 23 июля 2010

Вы почти у цели. Что вам нужно сделать, это создать набор Viewmodels для продукта и производителя. Глядя на код, я предполагаю, что ваш класс Product является сгенерированным классом linq-to-sql.

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

, но по какой-то причине Product.Manufacturer.ID и Product.ManufacturerID установлены в 0 (не ноль)

Ожидаемое поведение, так как 0 является значением по умолчанию для int (которое не может быть нулевым)

...