Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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
C# 更新正在引发EntityCollection已初始化错误_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 更新正在引发EntityCollection已初始化错误

C# 更新正在引发EntityCollection已初始化错误,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,我正在使用实体框架更新两个表。数据库模式由具有自动递增ID的客户表和具有外键关系的子表组成。子表只有两列—客户ID的复合键和varchar中作为第二列的信息 我有一个视图对象: public class CustomerView { public long id { get; set; } public String firstName { get; set; } public String lastName { get; set; } public String

我正在使用实体框架更新两个表。数据库模式由具有自动递增ID的客户表和具有外键关系的子表组成。子表只有两列—客户ID的复合键和varchar中作为第二列的信息

我有一个视图对象:

public class CustomerView
{
    public long id { get; set; }
    public String firstName { get; set; }
    public String lastName { get; set; }
    public String streetAddress { get; set; }
    public String city { get; set; }
    public String state { get; set; }
    public String zip { get; set; }
    public String profession { get; set; }
    public String[] linesOfBusiness { get; set; }
}
这是视图对象和实体之间的映射类:

internal static Customer getCustomerFromView(CustomerView customer)
{
    Customer newCustomer = new Customer
    {
        Customer_ID = customer.id,
        FirstName = customer.firstName,
        LastName = customer.lastName,
        Street = customer.streetAddress,
        City = customer.city,
        State = customer.state,
        Zip = customer.zip,
        Profession = customer.profession
    };
    foreach (String line in customer.linesOfBusiness)
    {
        newCustomer.LinesOfBusinesses.Add(new LinesOfBusiness { Customer_ID = customer.id, LineOfBusiness = line });
    }
    return newCustomer;
}
我可以创建实体,但当我去更新一个实体时,我遇到了实体集合已经初始化的错误。以下是更新方法:

private void updateCustomer(CustomerView customer)
{
    using (LocalCustomerDB data = new LocalCustomerDB())
    {
        Customer dbCustomer = (from c in data.Customers where c.Customer_ID == customer.id select c).Single();
        Customer tempCustomer = CustomerMapper.getCustomerFromView(customer);
        dbCustomer.FirstName = tempCustomer.FirstName;
        dbCustomer.LastName = tempCustomer.LastName;
        dbCustomer.LinesOfBusinesses = tempCustomer.LinesOfBusinesses;
        dbCustomer.Profession = tempCustomer.Profession;
        dbCustomer.State = tempCustomer.State;
        dbCustomer.Street = tempCustomer.Street;
        dbCustomer.Zip = tempCustomer.Zip;
        dbCustomer.City = tempCustomer.City;
        data.SaveChanges();
    }
}
我对实体框架相当陌生:我哪里出错了

谢谢

编辑


根据注释的要求,这里是调用update()的代码

这是堆栈跟踪:

 at System.Data.Objects.DataClasses.RelationshipManager.InitializeRelatedCollection[TTargetEntity](String relationshipName, String targetRoleName, EntityCollection1 entityCollection)
    at CustomerRegistry.Customer.set_LinesOfBusinesses(EntityCollection`1
value) in C:\Users\Michael\Documents\Personal
Projects\CustomerRegistry\CustomerRegistry\CustomerRegistry\CustomerModel.Designer.cs:line
386
    at CustomerRegistry.Project_Code.DataAccess.CustomerRepository.updateCustomer(CustomerView
customer) in C:\Users\Michael\Documents\Personal
Projects\CustomerRegistry\CustomerRegistry\CustomerRegistry\Project
Code\DataAccess\CustomerRepository.cs:line 41
    at CustomerRegistry.Project_Code.DataAccess.CustomerRepository.saveCustomer(CustomerView
customer) in C:\Users\Michael\Documents\Personal
Projects\CustomerRegistry\CustomerRegistry\CustomerRegistry\Project
Code\DataAccess\CustomerRepository.cs:line 19
    at CustomerRegistry.CustomerEntry.Submit_Click(Object sender,
EventArgs e) in C:\Users\Michael\Documents\Personal
Projects\CustomerRegistry\CustomerRegistry\CustomerRegistry\CustomerEntry.aspx.cs:line
40
    at System.Web.UI.WebControls.Button.OnClick(EventArgs e)
    at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
    at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument)
    at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument)
    at System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
    at System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

我不是100%肯定,因为我只是先使用代码完成实体,但我认为您缺少CustomerView中子对象集合的虚拟修饰符。尝试将CustomerView更改为:

public class CustomerView
{
    public long id { get; set; }
    public String firstName { get; set; }
    public String lastName { get; set; }
    public String streetAddress { get; set; }
    public String city { get; set; }
    public String state { get; set; }
    public String zip { get; set; }
    public String profession { get; set; }
    public virtual String[] linesOfBusiness { get; set; }
}
请注意业务行上的虚拟修改器。

尝试更改

dbCustomer.LinesOfBusinesses = tempCustomer.LinesOfBusinesses;

让我们知道例外情况仍然存在。
我认为您不能对导航属性(
dbCustomer.linesofbusinesss
)产生任何影响。您可以添加、删除、查询对象。但是您不能修改引用的实例。

显示调用
updateCustomer()
的代码。请发布“实体集合已初始化”错误的堆栈跟踪异常消失,其他所有内容都将更新。但是,业务线仍然没有更新。在通过lambda表达式运行更新之前,我删除了现有项。非常感谢。
dbCustomer.LinesOfBusinesses = tempCustomer.LinesOfBusinesses;
tempCustomer.LinesOfBusinesses.ForEach(z => dbCustomer.LinesOfBusinesses.Add(z));