2013-02-17 4 views
1

У меня есть следующие классы моделей (я сначала использую EF-код для генерации таблиц).отношения один к одному между двумя моделями?

public class MyClass 
{ 
    .... 
    [Required, ForeignKey("Address")] 
    public int Address1Id { get; set; } 
    virtual public Address Address1 { get; set; } 
    [Required, ForeignKey("Address")] 
    public int Address12d { get; set; } 
    virtual public Address Address2 { get; set; } 
    [Required, ForeignKey("Address")] 
    public int Address3Id { get; set; } 
    virtual public Address Address3 { get; set; } 
    .... 
} 
public class Address { .... } 

Я желаю создать вид MyClass показывает все поля адреса и адреса будут сохранены в таблице Адрес первым при сохранении MyClass. Но строительные леса создали поле DropDownList для адресов. Как изменить код, чтобы заставить его действовать, как эти поля адреса, закодированы в классе MyClass напрямую и позволить контроллеру сохранять адреса в таблице Address и AddressID в таблице MyClass?

<div class="editor-label"> 
     @Html.LabelFor(model => model.Address1Id, "Address") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("Address1Id", String.Empty) 
     @Html.ValidationMessageFor(model => model.Address1Id) 
    </div> 

Update: Я попытался создать следующую ViewModel, но подмости жалуются там нет ключа, определенного в классе.

public class DealViewModel 
{ 
    public Deal Deal { get; set; } 
    public Address Address { get; set; } 
} 
+0

- это проблема MVC или EF. MVC может использовать такие модели. EF ожидает тип, подходящий для ключа. Сложные типы подходят как ключи БД. Чего вы надеялись достичь? –

ответ

1

внешний ключ атрибутов не являются правильными:

[Required, ForeignKey("Address1")] 
... 
[Required, ForeignKey("Address2")] 
... 
[Required, ForeignKey("Address3")] 
... 

Address12d опечатка, я думаю)

1

Это звучит, как вы спрашиваете, как выравниваться модель для редактировать/создавать вид в MVC. Вы не хотите создавать Person, а затем создавайте адрес, но вместо этого создавайте его на одном экране. Если это то, о чем вы просите, да, вы можете это сделать! На самом деле, делать то, что вы хотите так же просто, как изменить свой вид создать что-то вроде:

<h3>Address 1</h3> 
@Html.EditorFor(x => x.Address1) 
<h3>Address 2</h3> 
@Html.EditorFor(x => x.Address2) 
...etc 

По умолчанию MVC достаточно умна, чтобы догадаться, что такое «редактор» для Address должен выглядеть. Текстовые поля для строк, флажки BOOLS и т.д. Если ваш [HttpPost] контроллер выглядит примерно так:

[HttpPost] 
public ActionResult Create(Person person) 
{ 
    if (ModelState.IsValid) 
    { 
     var context = new AppDbContext(); 
     context.People.Add(person); 
     context.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(personViewModel); 
} 

Если посмотреть в отладчике вы должны видеть, что Address свойства все заполнены в person Да, то MVC. ModelBinder - это умный! Вам не нужно ничего делать.

Примечание: Поскольку вы продвигаетесь в своем проекте, и ваша модель данных неизбежно становится более сложной, вы можете столкнуться с проблемами передачи объектов модели обратно и вперед с контроллера для просмотра. Я настоятельно рекомендую следовать шаблону использования ViewModels, которые представляют собой простые объекты, которые представляют собой «модель» для представления, то есть он должен собирать все данные, идущие к клиенту и от него. Это позволит вам сгладить вашу модель данных и включить только те поля, которые вам действительно нужны. Возможно, вам не понадобится использовать этот шаблон для этого конкретного примера, но он будет полезен в будущем.

Надеюсь, это поможет!

Смежные вопросы