我第一次使用Entity Framework而且我正在尝试使用集合创建一个对象(我希望集合中的所有对象也可以在数据库中创建)但是我有一些外来的密钥违规。
我的样本表:
table APPOINTMENTS: ID, VAR1, DATE_APPOINTMENT
table GUESTS: ID, APPOINTMENT_ID, USER_ID, VAR2, VAR3
我的测试代码:
DomainService aux = new DomainService();
APPOINTMENTS appointment = new APPOINTMENTS();
appointment.VAR1 = "BLA";
appointment.DATE_APPOINTMENT = new DateTime();
//The user with id = 1 is already created in the database
appointment.GUESTS.Add(new GUESTS { USER_ID = 1, VAR2 = 1, VAR3 = "F" });
aux.InsertAppointment(appointment);
在DomainService,我有:
public void InsertAppointment(APPOINTMENTS appointment)
{
using (var context = this.ObjectContext)
{
context.AddToAPPOINTMENTS(appointment);
context.SaveChanges();
}
}
但是我收到了这个错误: {“ORA-02291:违反了完整性约束(FK_GUESTS_APPOINTMENTS) - 未找到父密钥”}
我做错了什么?
更新 要在数据库中创建ID,我在插入前使用每个表的序列和触发器来获取下一个值。 当我创建单个对象时,例如没有客人的约会,它会插入数据库并生成id。
答案 0 :(得分:4)
解决此问题的方法:
“不会处理从序列生成的ID字段 正确。保存实体后,ID将返回0。 我将通过手动破解SSDL来解决这个问题(打开你的.edmx文件 文本编辑器)上有StoreGeneratedPattern =“Identity”属性 ID字段(第6行和第16行)。请注意,设计师可能会将此更改删除 在未来的修改。
虽然我认为这不是绝对必要的,但也可能是谨慎的 修改某些类型的元数据,例如将“number”更改为“int” 您的SSDL和适用的CSDL中的“Decimal”到“Int32”。 通常这些不会自动生成所需的值 尤其是XE。“
@http://www.chrisumbel.com/article/oracle_entity_framework_ef
答案 1 :(得分:2)
就我而言,只需打开图表.edmx并将每个主表中每个主键的属性StoreGeneratedPattern从None更改为Identity即可解决问题。保存后一切都很好。
我正在使用VS 2012,实体框架5(尚不支持6),Oracle 11.2,最后一个ODP.NET 12,.Net 4.5
答案 2 :(得分:2)
如果是EF代码第一种方法,如果出现此错误
(ORA-02291:违反了完整性约束(FK_GUESTS_APPOINTMENTS) - 未找到父密钥)
在我的情况下,有2个表具有Identity列。所以我刚刚添加了
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
我的模型类的属性就在数据库中的标识列的上方,它解决了我的问题:)
希望这有帮助:)
答案 3 :(得分:0)
我无法确定您在哪里设置主键(约会类的ID属性)。你在数据库端使用密钥生成器吗?如果不是这应该是问题。
答案 4 :(得分:-1)
您正在插入一个记录,该记录具有在约束引用的父表中找不到的外键值。