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文件中的标识(找到了模型浏览器未更改的另一个位置)-并且它按预期工作!!再次感谢。