2012-06-04 2 views
1

Я пытаюсь получить список проектов на индексной странице, но я продолжаю получать ошибки. Я пробовал разные коды, а ниже - последний, который я пробовал, но он все еще не работает. Это дало мне эту ошибку:System.InvalidOperationException: указанный путь Include недействителен

System.InvalidOperationException: Указанный путь Include недействителен. EntityType «StoreWeb.Models.Project» не объявляет свойство навигации с именем «Коллекции»

Я думаю, это потому, что я не знаю, как получить collectionID из таблицы Project. Для таблицы Project она имеет идентификатор collectionID как внешний ключ. (Проект должен иметь 1 коллекцию. У коллекции могут быть проекты.)

Может кто-нибудь, пожалуйста, помогите мне? Вот что у меня есть:

МОДЕЛИ


Collection.cs [Modified]


[Table("Collection")] 
public class Collection 
{ 
    [Key] 
    public string collectionID { get; set; } 
    public string collectionName { get; set; } 

    public List<Project> Projects { get; set; } 
} 

Project.cs [Modified]


[Table("Project")] 
public class Project 
{ 
    [Key] 
    public string projectID { get; set; } 
    public string projectName { get; set; } 
    public string projectCity { get; set; } 
    public string collectionID { get; set; } // This is what was needed! 

    public virtual Collection Collection { get; set; } 
} 

Для класса Project он имеет идентификатор collectionID как внешний ключ. (Проект должен иметь 1 коллекции. Коллекция может иметь проекты.)


ProductEntities.cs


public class ProductEntities : DbContext 
{ 
    public DbSet<Collection> Collections { get; set; } 
    public DbSet<Project> Projects { get; set; } 
} 

CONTROLLER


ProjectController [Modified]


using System.Data.Entity; 

public class ProjectController : Controller 
{ 
    ProductEntities productDB = new ProductEntities(); 

    // 
    // GET: /Project/ 

    public ActionResult Index() 
    { 
     var projectModel = productDB.Projects.Include(m => m.Collection); 
     return View(projectModel); 
    } 

МНЕНИЯ


Views/Project/Index.CHTML


@model IEnumerable<StoreWeb.Models.Project> 

@{ 
    ViewBag.Title = "Index"; 
} 
<h1>PROJECTS</h1> 

    @foreach (var project in Model) 
    { 
     <br /><a href="@Url.Action("Details", new { id = project.projectID })">@project.projectName</a> 
    } 

ответ

3

Просто опечатка

public ActionResult Index(string project) 
    { 
     var projectModel = productDB.Projects.Include("Collection"); 
     return View(projectModel); 
    } 

, а не "Коллекции"

TIP (дня)

в ваших usings, добавьте

using System.Data.Entity; 

, а затем вы можете сделать

var projectModel = productDB.Projects.Include(m => m.Collection); 

вы избежите "строка" опечаток.

EDIT

для классов, если вы используете код Первый (который вы)

удалить "ForeignKeys" (collection_id в проекте, к примеру), и просто сделать

//remove the "Bind Exclude" 
public class Collection 
{ 
    public int Id { get; set; }//make it int, it will be taken as the primary key 
    public string collectionName { get; set; } 

    public virtual IList<Project> Projects { get; set; }//make it virtual, lazy loading inside 
} 

в вашем проекте класса

//remove any "collection_Id" property 
public class Project 
{ 
    public int Id { get; set; }//make it it, rename it, it will be taken as PK 
    public string projectName { get; set; } 
    public string projectCity { get; set; } 

    public virtual Collection Collection { get; set; } 
} 
+0

Спасибо вы за вашу помощь, Рафаэль. Я пробовал оба ваших предложения, но оба они дали мне эту ошибку: ::: System.Data.SqlClient.SqlException: Недопустимое имя столбца «Collection_collectionID» ::: (В столбце «идентификатор коллекции» есть имя столбца «идентификатор коллекции» Таблицы проектов и коллекций.) Есть ли что-нибудь еще, что я могу попробовать? – jannn

+0

Сначала вы используете код? –

+0

Есть ли способ использовать строку в качестве типа данных для PK (b/c для PK для Project и Collection есть сочетание букв и цифр)? – jannn

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