2016-01-27 2 views
0

Моя вставка в двух таблицах успешна, но я получаю ошибку в действии индекса для отображения данных.Cant view Index Действие для отображения данных в MVC

Модель и модель.

Просмотр моделей

public class VMUsers 
{ 
    public int Id { get; set; } 
    public string FullName { get; set; } 
    public string LastName { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
} 

Модели

[Table("tblUsers")] 
public class Users 
{ 
    [Key] 
    public int Id { get; set; } 
    public string FullName { get; set; } 
    public string LastName { get; set; } 
} 

[Table("tblUserDetails")] 
public class UserDetails 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 

    public int UserID { get; set; } 
} 

DBSet

public System.Data.Entity.DbSet<MVCLearning.Models.VMUsers> Combination { get; set; } 

Индекс Действие

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

    } 

Getting исключение

Исключение типа «System.Data.Entity.Core.EntityCommandExecutionException» произошло в EntityFramework.SqlServer.dll, но не был обработан в пользовательском коде

Дополнительная информация: Произошла ошибка во время выполнения определение команды. Подробнее см. Внутреннее исключение.

Не могу понять, что это за внутреннее исключение.

Это ломается, поэтому отладочная часть, чтобы увидеть, что ошибка также ломается, не переходит в представление для отладки.

+2

«VMUsers» - это модель представления, а не модель данных. Он не должен иметь никакого отношения к EF. –

+0

Кроме того, вы уверены, что определение модели вашей сущности верное? Имеет ли отношение внешних ключей между таблицами? – Shyju

+0

Как будто теперь было полезно добавлять данные в две таблицы, поэтому было просто и без ПК и FK, но в реальном времени PK и FK будут там. – Dave

ответ

2

Одна вещь, которую вы должны сделать, это создать свойства навигации между вашими объектами, но сначала я думаю, что вы пытаетесь создать отношения один к одному между User и UserDetail. Если это так, PK зависимого объекта (в данном случае UserDetail) также должен быть FK ваших отношений. Ваша модель будет так:

[Table("tblUsers")] 
public class Users 
{ 
    [Key] 
    public int Id { get; set; } 
    public string FullName { get; set; } 
    public string LastName { get; set; } 

    public virtual UserDetail Detail { get; set; } 
} 

[Table("tblUserDetails")] 
public class UserDetails 
{ 
    [Key,ForeignKey("User")] 
    public int UserId { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 

    public virtual User User { get; set; } 
} 

Теперь DBSet<TEntity> свойства в вашем контексте должны быть определены, используя ваши типы сущностей:

public DbSet<MVCLearning.Models.User> Users { get; set; } 
public DbSet<MVCLearning.Models.UserDetail> UserDetails { get; set; } 

Теперь в контроллере можно объявить запрос, как это проецирование результат в вашем классе VM:

public ActionResult Index() 
{ 
    return View(db.Users.Select(u=>new VMUsers{ Id=u.Id, 
               FullName=u.FullName, 
               LastName=u.LastName, 
               Address2=u.Detail.Address1, 
               Address1=u.Detail.Address2})); 

} 
+0

Почему публичная виртуальная деталь UserDetail {get; задавать; } и публичный виртуальный пользователь User {get; задавать; } Многие разработчики видели это с помощью виртуального ключевого слова, но не понимали его значимости. – Dave

+0

Это требование для ленивой загрузки. Проверьте это [сообщение] (http://stackoverflow.com/questions/5597760/what-effects-can-the-virtual-keyword-have-inity-framework-4-1-poco-code-fi) и на странице [msdn] (https://msdn.microsoft.com/library/dd468057 (v = vs.110) .aspx) подробно описываются все требования, которые вам необходимо выполнить. – octavioccl

+0

Выучил много от вашего ответа. – Dave

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