2013-07-04 2 views
0

у меня есть две таблицы PartyRole и PartyRoleType в базе данных, модели которой в приложении являются:Проблема при создании новых записей в базе данных + MVC4

PartyRole:

public partial class PartyRole : ILockable, IAuditable, IOverTime 
{ 
    /*** Construtor(s) ***/ 
    public PartyRole() 
    { 
    } 

    public PartyRole(PartyRoleType obj) 
     : this() 
    { 
     PartyRoleType = obj; 
    } 

    /*** Public Members ***/ 
    [Key, Display(Name = "Id")] 
    public int PartyRoleId { get; set; } 

    [Required] 
    public int PartyRoleTypeId { get; set; } 

    [Required] 
    public int PartyId { get; set; } 


    /* IOverTime */ 
    [Required, Display(Name = "From")] 
    public System.DateTimeOffset FromDate { get; set; } 

    [Display(Name = "Thru")] 
    public Nullable<System.DateTimeOffset> ThruDate { get; set; } 


    /* Navigation Properties */ 

    /// <summary> 
    /// Foreign key to PartyRoleType: PartyRoleTypeId 
    /// </summary> 
    public virtual PartyRoleType PartyRoleType { get; set; } 
} 

PartyRoleType:

public partial class PartyRoleType : ILockable, IAuditable, IEntity 
{ 
    /*** Construtor(s) ***/ 
    public PartyRoleType() 
    { 
     PartyRoleTypePartyRoles = new List<PartyRole>(); 
    } 


    /*** Public Members ***/ 
    [Key, Display(Name = "Id")] 
    public int PartyRoleTypeId { get; set; } 


    /* IEntity */ 
    public string Caption { get; set; } 

    public string NameInUse { get; set; } 

    public string Description { get; set; } 

    /* Navigation Properties */ 

    /// <summary> 
    /// Foreign key from PartyRole: PartyRoleTypeId 
    /// </summary> 
    public virtual ICollection<PartyRole> PartyRoleTypePartyRoles { get; set; } 
} 

Мы используют шаблоны unitofwork и репозитория для общения с базой данных.

Я покажу экран (в основном, MVC), чтобы создать новую роль партии или отредактировать роль стороны eixsting.

Возьмите сценарий создания новой партийной роли. Я заполню FromDate & ThruDate, и я выберу PartyRoleType, что он будет принадлежать выпадающему списку PartyRoleType и нажмет на сохранение.

Я получаю сообщение об ошибке, связанной с PartyRoleType Caption, NameInUse и т. Д. Я удалил требуемую аннотацию данных из модели PartyRoleType, потому что любые способы, которыми мы не заполняем таблицы типов из пользовательского интерфейса.

ушла Эта ошибка, однако я получаю другую ошибку он не может вставить аннулирует Into подпись nameinuse и т.д.,

В основном то, что происходит, если я пытаюсь создать новый PartyRole, то UnitOfWork пытается создать записи в PartyRoleType. Я думаю, что он пытается создать записи во всех своих дочерних элементах, которые не должны произойти.

Может кто-нибудь, пожалуйста, сообщите, как с этим справиться, или я делаю что-то неправильно здесь?

Мой контроллер:

[HttpPost] 
    public ActionResult Create(PartyRole obj) 
    { 
     obj.Party.PartyId = obj.PartyId; 
     obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId; 

     if (ModelState.IsValid) 
     { 
      PartyRoleRepo.Create(obj); 
      UnitOfWork.Save(); 
      return RedirectToAction("List"); 
     } 
     else 
     { 
      ViewBag.PossiblePartyRoleTypes = PartyRoleTypeRepo.All(); 
      ViewBag.PossibleParties = PartyRepo.All(); 
      return View(); 
     } 
    } 

Код, который населяет PartyRoleTypes:

<div class="l"> 
PartyRoleType 
@(Html.DropDownListFor(O => 
    O.PartyRoleTypeId, 
    ((IEnumerable<PartyBiz.Models.Objects.PartyRoleType>)ViewBag.PossiblePartyRoleTypes) 
     .Select(OPT => 
      new SelectListItem 
      { 
       Text = (OPT == null ? "None" : OPT.Caption), 
       Value = OPT.PartyRoleTypeId.ToString(), 
       Selected = (Model != null) && (OPT.PartyRoleTypeId == Model.PartyRoleTypeId) 
      } 
     ), 
     "Choose...", 
     new { @class = "combo"} 
    ) 
) 
@Html.ValidationMessageFor(o => o.PartyRoleTypeId) 
</div> 

ответ

0

Нам нужно передать null в свойство PartyRoleType PartyRole, чтобы не создавать дочерние элементы. :)

0

Почему не вставив несколько фиктивных PartyRoleTypes в базу данных? Похоже, вы пытаетесь вставить корзину перед лошадью (если я не ошибаюсь - у вас есть данные в PartyRoleType?). На вашем классе PartyRole у вас есть:

[Required] 
public int PartyRoleTypeId { get; set; } 

Таким образом, ДОЛЖЕН быть установлен хотя бы один параметр PartyRoleType. Что касается того, почему он пытается вставить один для вас, я не уверен, но когда у меня такие отношения, я всегда вставляю некоторые фиктивные типы в ссылку.

Перемещение, после ваших комментариев Я вижу, что это не проблема.

Что происходит здесь:

obj.Party.PartyId = obj.PartyId; 
obj.PartyRoleType.PartyRoleTypeId = obj.PartyRoleTypeId; 

OBJ имеет тип PartyRole, в классе PartyRole я не вижу определение партии. Итак, как вы устанавливаете obj.Party.PartyId? Является ли класс PartyRole переданным в ваш Action метод некоторой моделью представления?

+0

У меня так много данных в PartyRoleType.Caption from PartyRoleType, я показываю его в представлении mvc в выпадающем меню, чтобы пользователь мог pcik типа для созданного им partyrole. PartyRoleTypeId - это внешний ключ в PartyRole. Мы определенно не вставляем фиктивные данные в PartyRoleType, потому что создание новых типов - это другой процесс. Мы получаем список разрешенных типов от клиента, и мы обновляем эти таблицы по-разному. Здесь что-то связано с Unitofwork.Save(), мы не всегда хотим, чтобы это создало дочерние записи, это неправильно! – mmssaann

+0

Да, это определенно неправильно :). Это странно, я боюсь, что я неправильно понял. Можете ли вы показать код, который заполняет раскрывающийся список PartyRoleType? – Jack

+0

Thats alright..Я рад, что вы взяли когда-нибудь, чтобы посмотреть на этот вопрос .. – mmssaann

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