Asp.net mvc 4 使用实体框架检索数据时发生异常(代码优先)
我不确定改变你的问题的协议是什么,但我想如果我改变它会更好,因为有很多信息,问这个问题的初衷已经失去了 原始问题: 我最初在使用EF(代码优先方法/POCO类)生成数据库时遇到了一个问题。 问题之一是我在实体类中使用构造函数来初始化成员。在@RickStahl建议不需要它之后,我改变了我的实现 为了读者的利益,我不希望信息丢失,因为一些旧评论打算解决这个问题 然而,在这个线程最初创建以来的一段时间内,情况发生了变化。我已经克服了一些问题 当前问题: 从基础数据库表检索内容时遇到问题 例外情况: 对象引用未设置为对象的实例。 Program.cs的以下语句(第21行)出现异常: 为了便于理解这个问题,我粘贴了整个源代码 这是我的实体类的源代码。Asp.net mvc 4 使用实体框架检索数据时发生异常(代码优先),asp.net-mvc-4,c#-4.0,ef-code-first,entity-framework-6,poco,Asp.net Mvc 4,C# 4.0,Ef Code First,Entity Framework 6,Poco,我不确定改变你的问题的协议是什么,但我想如果我改变它会更好,因为有很多信息,问这个问题的初衷已经失去了 原始问题: 我最初在使用EF(代码优先方法/POCO类)生成数据库时遇到了一个问题。 问题之一是我在实体类中使用构造函数来初始化成员。在@RickStahl建议不需要它之后,我改变了我的实现 为了读者的利益,我不希望信息丢失,因为一些旧评论打算解决这个问题 然而,在这个线程最初创建以来的一段时间内,情况发生了变化。我已经克服了一些问题 当前问题: 从基础数据库表检索内容时遇到问题 例外情况:
我终于找到了解决我自己问题的办法。但我想对@SteveGreene和@RickStahl的宝贵意见表示“感谢” @RickStahl给出了一个很好的建议,在我的实体类中不使用参数化构造函数。根据Rick的说法,参数化构造函数不使用EF @史蒂夫格林-我终于意识到你给我指明了正确的方向。由于我对EF缺乏了解,当时我没能拿到它。然而,在详细阅读了EF之后,特别是关于渴望加载和懒惰加载的内容,最终帮助了我 在我发现必须在ContactData类构造函数中实例化“电话”和“电子邮件”的收集属性后,与“对象引用未设置为对象实例”相关的错误很容易解决 请参阅下面的代码更改
public class ContactData
{
[Key]
public int ContactId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string BusinessName { get; set; }
public IList<PhoneNumber> Phones { get; set; }
public IList<EmailAddress> Emails { get; set; }
public ContactData()
{
//By instantiating Phones and Emails member collections below, resolved 'Object reference not set to an instance of an object' exception
Phones = new List<PhoneNumber>();
Emails = new List<EmailAddress>();
}
}
这是ContactManager类的完整代码
class ContactManager
{
ContactContext cDbContext = new ContactContext();
public IList<ContactData> GetContactList()
{
ContactData cd = new ContactData();
IQueryable<ContactData> cContactList = cDbContext.Contacts;
IList<ContactData> cListData = new List<ContactData>();
var phones = cDbContext.Contacts.Include("Phones").ToList();
var emails = cDbContext.Contacts.Include("Emails").ToList();
cListData = cContactList.ToList();
return cListData;
}
}
如果有任何疑问,请发表评论。好吧,因为消息说您在ContactData上没有无参数构造函数,并且您在创建集合时正在调用它。如果您试图简化设置,您可能需要查看automapper。@SteveGreene当您的实体对象具有参数化构造函数时,按原样使用O/RM是否太复杂?要使EF正常工作,您的实体需要具有无参数构造函数。所有这些参数都是多余的,因为你可以使用更灵活的参数赋值语法。你可以这样做,但是你想实现什么呢?上面的代码不需要它们。我希望我的POCO是最小的,然后我在控制器中构造一个视图模型,并使用AutoMapper来回传输数据。有一点学习曲线,但效果很好。试试IQueryable cContactList=cDB.Contacts.Include(c=>c.Phones)。Include(c=>c.email);
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
namespace ConsoleApplication1
{
public class ContactContext : DbContext
{
public ContactContext()
: base("ContactDBContext")
{
Database.SetInitializer<ContactContext>(new DropCreateDatabaseIfModelChanges<ContactContext>());
}
public DbSet<ContactData> Contacts { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class ContactManager
{
ContactContext cDbContext = new ContactContext();
public IList<ContactData> GetContactList()
{
IQueryable<ContactData> cContactList = cDbContext.Contacts;
IList<ContactData> cListData = new List<ContactData>();
cListData = cContactList.ToList();
return cListData;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
ContactManager cMgr = new ContactManager();
foreach (ContactData cd in cMgr.GetContactList())
{
Console.WriteLine(cd.ContactId);
Console.WriteLine(cd.FirstName);
Console.WriteLine(cd.LastName);
foreach(PhoneNumber p in cd.Phones)
{
Console.WriteLine(p.Phone);
}
foreach (EmailAddress e in cd.Emails)
{
Console.WriteLine(e.Email);
}
}
Console.ReadKey();
}
public class ContactData
{
[Key]
public int ContactId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string BusinessName { get; set; }
public IList<PhoneNumber> Phones { get; set; }
public IList<EmailAddress> Emails { get; set; }
public ContactData()
{
//By instantiating Phones and Emails member collections below, resolved 'Object reference not set to an instance of an object' exception
Phones = new List<PhoneNumber>();
Emails = new List<EmailAddress>();
}
}
var phones = cDbContext.Contacts.Include("Phones").ToList();
var emails = cDbContext.Contacts.Include("Emails").ToList();
class ContactManager
{
ContactContext cDbContext = new ContactContext();
public IList<ContactData> GetContactList()
{
ContactData cd = new ContactData();
IQueryable<ContactData> cContactList = cDbContext.Contacts;
IList<ContactData> cListData = new List<ContactData>();
var phones = cDbContext.Contacts.Include("Phones").ToList();
var emails = cDbContext.Contacts.Include("Emails").ToList();
cListData = cContactList.ToList();
return cListData;
}
}
var emails = cDbContext.Contacts.Include("Emails").ToList();