Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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
Entity framework 4 插入新对象并与具有标识列的新对象关联_Entity Framework 4 - Fatal编程技术网

Entity framework 4 插入新对象并与具有标识列的新对象关联

Entity framework 4 插入新对象并与具有标识列的新对象关联,entity-framework-4,Entity Framework 4,客户类别: class Customer { int id; int phone; int fax; PhoneNumber phone1; PhoneNumber fax1; } Class PhoneNumber { int id; int prefixid; string number; } 电话号码是由EF4自动生成的,我已将自动生成的姓名更改为phone1和fax1 phonenumber id和customer id都是数据库中的标识列 现在我想创建一个

客户类别:

class Customer 
{ 
  int id; 
  int phone;
  int fax;
  PhoneNumber phone1;
  PhoneNumber fax1;
}

Class PhoneNumber
{
int id;
int prefixid;
string number;
}
电话号码是由EF4自动生成的,我已将自动生成的姓名更改为phone1和fax1

phonenumber id和customer id都是数据库中的标识列

现在我想创建一个新客户:

       var newCustomer = Customer.CreateCustomer(0, CompanyID);
        PhoneNumber fax = new PhoneNumber();
        PhoneNumber phone = new PhoneNumber();

        fax.Customers.Add(newCustomer);
        phone.Customers.Add(newCustomer);

        context.Customers.AddObject(newCustomer);
        context.SaveChanges();
但现在我明白了:

System.Data.UpdateException:{“无法 插入标识的显式值 表“PhoneNumber”中的列 标识\u INSERT设置为OFF。“}

为什么EF4不处理相关表的identity列,因为它应该处理一个新实体?我怎样才能做到这一点

(EF4应该在Phones表中创建2个实体,获取它们的标识并将其添加到新客户的customer行中-至少这是我想要做的)

我知道我可以创建2个电话记录,而不是创建一个客户记录,但是

a。我希望它能一幕完成


b。如果cusotmer创建失败-我不希望phones表上出现空记录…

那么这两件事相互矛盾:

phonenumber id和customer id都是数据库中的标识列

但错误是:

System.Data.UpdateException:{“当identity_insert设置为OFF时,无法在表'PhoneNumber'中插入identity列的显式值。”}

这个错误似乎是说正在设置重复的标识,但事实并非如此——它是说您试图显式设置标识字段

这意味着PhoneNumber中的ID列不是标识字段。或者至少英孚不这么认为

所以我有四个问题:

1) 您是否确认该字段在EDMX中设置为IDENTITY?也许有什么东西覆盖了它

2)
CreateCustomer
方法做什么?它是否只是新建立了一个客户并设置了一些属性?它不应触及标识字段

3) 您是否在EDMX上正确设置了导航属性/基数?例1.顾客。。1-*电话号码

4) 尝试向客户添加电话号码,而不是相反。将“多”添加到“一”中是有意义的,例如,此处的“客户”是聚合:

var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.phone1 = new PhoneNumber();
newCustomer.fax1 = new PhoneNumber();
context.Customers.AddObject(newCustomer);
context.SaveChanges();
我还建议重新设计你的模型

让一个客户有一份传真和一个电话号码,每个号码上都有一处房产,这是愚蠢的。它应该是一个客户有许多“电话号码”实体

您可以在PhoneNumber实体上使用TPH来区分传真和其他类型,上面的代码更有意义:

var newCustomer = Customer.CreateCustomer(0, CompanyID);
newCustomer.Phones.Add(new FaxNumber());
newCustomer.Phones.Add(new MobileNumber());
context.SaveChanges();

谢谢你的回复。1.EDMX是自动生成的。电话号码id是DB中的标识,它不在EDMX上-我正在尝试修复它。2.此方法由VS2010自动生成。3.每个客户实际上有4个电话号码。它有4个导航属性,我只更改了它们的名称。4.我也犯了同样的错误。您的设计更好,但我希望每个客户都有4个电话号码,其中1个是传真,1个是手机-因此我将其设置为固定关系(1:4),而不是1:N。我正在手动更改edmx并重试(标识)我已将电话号码ID更改为edmx中的标识,尝试了两种方法(也尝试了使用newCustomer.CellNumber=new PhoneNumber();)同样的错误也会发生。将手机ID更改为XML文件中的标识(找到了模型浏览器未更改的另一个位置)-并且它按预期工作!!再次感谢。