Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 4 使用实体框架检索数据时发生异常(代码优先)_Asp.net Mvc 4_C# 4.0_Ef Code First_Entity Framework 6_Poco - Fatal编程技术网

Asp.net mvc 4 使用实体框架检索数据时发生异常(代码优先)

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建议不需要它之后,我改变了我的实现 为了读者的利益,我不希望信息丢失,因为一些旧评论打算解决这个问题 然而,在这个线程最初创建以来的一段时间内,情况发生了变化。我已经克服了一些问题 当前问题: 从基础数据库表检索内容时遇到问题 例外情况:

我不确定改变你的问题的协议是什么,但我想如果我改变它会更好,因为有很多信息,问这个问题的初衷已经失去了

原始问题: 我最初在使用EF(代码优先方法/POCO类)生成数据库时遇到了一个问题。 问题之一是我在实体类中使用构造函数来初始化成员。在@RickStahl建议不需要它之后,我改变了我的实现

为了读者的利益,我不希望信息丢失,因为一些旧评论打算解决这个问题

然而,在这个线程最初创建以来的一段时间内,情况发生了变化。我已经克服了一些问题

当前问题: 从基础数据库表检索内容时遇到问题

例外情况: 对象引用未设置为对象的实例。

Program.cs的以下语句(第21行)出现异常: 为了便于理解这个问题,我粘贴了整个源代码

这是我的实体类的源代码。
我终于找到了解决我自己问题的办法。但我想对@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();