实体框架一对多插入 - 外键违规

时间:2011-09-30 11:30:22

标签: c# oracle entity-framework

我第一次使用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。

5 个答案:

答案 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)

您正在插入一个记录,该记录具有在约束引用的父表中找不到的外键值。