Как использовать DBContext с Entity Framework

Я новичок в MVC, и я не знаю, задаю ли я правильный вопрос, но я использую EF и следую учебному пособию, в котором используется DBContext, я хотел бы заполнить некоторые данные из My EF для отображения в представлении, которое позволяет использовать CRUD операции.

Model:

[Table("ProjectInformation")]
public class ProjectDetailsViewModels
{
    [Key]
    public int pkiProjectID { get; set; }
    public string ProjectName { get; set; }
    public string DesignerName { get; set; }
    public string ProjectType { get; set; }
    public string FluidType { get; set; }
    public string PipeMaterial { get; set; }
}


public class ProjectDBContext : DbContext
{
    public DbSet<ProjectDetailsViewModels> Projects { get; set; }
}

Ниже мой контроллер, и я добавил только метод создания.

Controller:

public class ProjectDetailController : Controller
{

    private ProjectDBContext db = new ProjectDBContext();

    public ActionResult Index()
    {
        return View(db.Projects.ToList());
    }

    // GET: Movies/Details/5
    public ActionResult Details(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        ProjectDetailsViewModels ProjectModel = db.Projects.Find(id);
        if (ProjectModel == null)
        {
            return HttpNotFound();
        }
        return View(ProjectModel);
    }

    // GET: Movies/Create
    public ActionResult Create()
    {
        return View();
    }

    // POST: Movies/Create
    // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
    // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create([Bind(Include = "pkiProjectID,ProjectName,DesignerName,ProjectType,FluidType, PipeMaterial")] ProjectDetailsViewModels ProjectModel)
    {
        if (ModelState.IsValid)
        {
            db.Projects.Add(ProjectModel);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(ProjectModel);
    }
}

Ниже мой взгляд:

View :

@model IEnumerable<AirFlo_Size_Programme.Models.ProjectDetailsViewModels>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Index</h2>

<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
    <th>
        @Html.DisplayNameFor(model => model.ProjectName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.DesignerName)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.ProjectType)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.FluidType)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.PipeMaterial)
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.ProjectName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.DesignerName)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.ProjectType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.FluidType)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.PipeMaterial)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.pkiProjectID }) |
            @Html.ActionLink("Details", "Details", new { id=item.pkiProjectID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.pkiProjectID })
        </td>
    </tr>
}

</table>

Ниже приведена ошибка, которую я получаю:

Invalid object name 'dbo.ProjectInformation'. 

Итак, из-за другого сообщения, которое я прочитал, я добавил следующее в свою модель:

Я проверил, и каждая из этих таблиц имеет первичный ключ.

Дайте мне знать, где я ошибаюсь / что я делаю неправильно.

Спасибо!


person AxleWack    schedule 19.05.2016    source источник
comment
Попробуйте просто public int Id на ProjectDetailsViewModels или украсьте pkiProjectID атрибутом [Key].   -  person James P    schedule 19.05.2016
comment
Спасибо за быстрый ответ. Я пробовал оба и все еще получаю ту же ошибку   -  person AxleWack    schedule 19.05.2016
comment
Вы не включили свою модель ProjectInformation, поэтому мы не можем точно сказать.   -  person Erik Funkenbusch    schedule 19.05.2016
comment
Вам нужно поместить атрибуты [Key] в поля Id во всех ваших моделях.   -  person Venky    schedule 19.05.2016
comment
@Erik Funkenbusch: изначально я использовал ProjectDetailsViewModels вместо ProjectInformation (это имя моей таблицы в моей БД), но я получил эту ошибку: Недопустимое имя объекта «dbo.ProjectDetailsViewModels».   -  person AxleWack    schedule 19.05.2016


Ответы (1)


Вам необходимо указать атрибут [Key] для поля первичного ключа. Тогда только Entity Framework понимает его как первичный ключ.

public class ProjectDetailsViewModels
{
    [Key]
    public int pkiProjectID { get; set; }
    public string ProjectName { get; set; }  
    public string DesignerName { get; set; }
    public string ProjectType { get; set; }
    public string FluidType { get; set; }
    public string PipeMaterial { get; set; }
}

Также я думаю, что вы неправильно определяете другие поля.

public string ProjectName { get; set; }   

Это не имеет никакого смысла

Я думаю, это должно быть

public ProjectName ProjectName { get; set; } 

or

public string Name { get; set; } 
person Venky    schedule 19.05.2016