Использование CodeFirst с EF изо всех сил, чтобы получить раскрывающийся список для работы - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь разработать довольно простое приложение для использования в офисе и для собственных учебных целей.

В настоящее время я немного застрял с появлением выпадающего списка.

Структура данных

Таблица: Ресурс
ResourceID (int) (PK)
Имя (варчар)
Описание (варчар)
ResourceTypeID (int) (FK)

таблица: REsourceType
ResourceTypeID (int) (PK)
Заголовок (varchar)
Описание (варчар)

Итак, простая структура данных. Каждый ресурс имеет один тип, но каждый тип может быть применен ко многим ресурсам. У меня есть 3 файла модели:

Ресурс

namespace ESF_ResourceManager.Models
{
    public class Resource
    {
        [Key]
        public int ResourceID { get; set; } 

        [Required(ErrorMessage="Please enter a name for the resource")]
        [StringLength(50, ErrorMessage="Resource name is too long, 50 characters or less")]
        public string Name { get; set; }

        [Required(ErrorMessage="Please neter a meaningful description of this resource")]
        public string Description { get; set; }

        [Required(ErrorMessage="Please specify the turn around time in minutes")]
        public int TurnAroundTime { get; set; }

        // links resource to a resource type
        public int ResourceTypeID { get; set; }


         //public virtual ICollection<ResourceType> ResourceTypes { get; set; }
        // public virtual ResourceType ResourceTypeID { get; set; }
    }
}

ResourceType

namespace ESF_ResourceManager.Models
{
    public class ResourceType
    {
        [Key]
        public int ResourceTypeID { get; set; }

        [Required(ErrorMessage = "Please enter a title for the resource type")]
        [StringLength(50, ErrorMessage = "Resource type name is too long, 50 characters or less")]
        public string Title { get; set; }

        [Required(ErrorMessage = "Please enter a meaningful description for the resource type")]
        public string Description { get; set; }

        public virtual ICollection<Resource> Resources { get; set; }
        //public virtual Resource Resource {get; set;}
    }
}

ResourceAdminManager

namespace ESF_ResourceManager.Models
{
    public class ResourceAdminManager : DbContext
    {
        public DbSet<Resource> Resources { get; set; }
        public DbSet<ResourceType> ResourceTypes { get; set; }
    }
}

Я разработал представления и контроллеры для Resource и ResourceType. ResourceType действительно прост, и этот набор работает просто отлично. Проблема, с которой я сталкиваюсь, заключается в понимании того, как получить представления Resource для Create и Edit для отображения параметров ResourceType в раскрывающемся списке, и как отобразить заголовок ResourceType, а не ID во всех представлениях.

Я провел некоторое время, просматривая это, и пока не нашел ничего, что могло бы помочь моему пониманию. Так что, пожалуйста, как новичок, успокойся со мной, и я уверен, что доберусь до тебя с твоей помощью.

Большое спасибо nathj07

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Модель просмотра - CreateResourceViewModel.cs:

public class CreateResourceViewModel
{
    public Resource Resource { get; set; }
    public ICollection<ResourceType> ResourceTypes { get; set; }
} 

Контроллер (ResourceController.cs):

[HttpGet]
public ActionResult Create()
{
    var dbContext = new ResourceDbContext();

    var model = new CreateResourceViewModel
                    {
                        Resource = new Resource(),
                        ResourceTypes = dbContext.ResourceTypes.ToList()
                    };

    return View(model);
}

[HttpPost]
public ActionResult Create(CreateResourceViewModel model)
{
    // process model

    return RedirectToAction("Success");
}

Представление (Create.cshtml):

@model ResourceMVC.Models.CreateResourceViewModel

<div class="editor-label">
    @Html.LabelFor(x => x.Resource.ResourceTypeId)
</div>

<div class="editor-field">
    @Html.DropDownListFor(x => x.Resource.ResourceTypeId, 
                          new SelectList(Model.ResourceTypes, "ResourceTypeId", "Title"),
                          "-- Select Resource Type --")
</div>

Это свяжет Id выбранного ResourceType с ResourceTypeId нового Resource объекта, когда он будет отправлен обратно в ResourceController.

0 голосов
/ 20 октября 2011

Вы еще не связали ResourceTypes с ресурсом.

Добавить к ресурсу:

[Include]
[Association("GiveItAName", "ResourceID", "ResourceTypeID")]
public EntityCollection<ResourceType> ResourceTypes { get; set; }

или

[Include]
[Association("GiveItAName", "ResourceID", "ResourceTypeID")]
public ResourceType ResourceType { get; set; }

Использовать атрибут [ForeignKey]чтобы пометить поля идентификаторов как FK-поля.

Тогда вы сможете делать такие вещи, как MyResource.ResourceType.Title Используйте Fiddler и надстройку WCF Binary, чтобы убедиться, что EF возвращает объекты и правильно включает в себя дочерние элементы.,

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