【问题标题】:Entity Framework: Avoiding primary key violation in child object实体框架:避免子对象中的主键违规
【发布时间】:2015-02-12 20:53:06
【问题描述】:

我对 EF 很陌生,所以这可能很简单。

基本上我想添加多个具有相同主键的子对象,但我不断收到主键违规。

我想知道如何添加包含具有相同主键的子对象的对象列表而不会引发异常。我希望有一种方法可以告诉 Add() 忽略子插入(如果存在)。

我创建了 2 个简单的类来更好地描述这一点。

Public class Race
{
    Int Id;
    EventType Event;
}

Public class EventType
{
    Int Id;
    String Description;
}

Var event1 = new EventType();
event1.id = 1

Var event2 = new EventType();
event2.id = 1

Race race1 = new Race();
race1.id = 99;
race1.EventType = event1;

Race race2 = new Race();
race2.id = 100
race2.EventType = event2;

现在在我的 DbContext 中我只想做:

Db.Add(race1);
Db.Add(race2);
SaveChanges();

这会引发主键冲突。

如果我将相同的 EventType 对象分配给两个 Race 实例,它可以正常工作,但实际上我不能这样做,因为该父对象是由数据馈送在外部创建的。

【问题讨论】:

    标签: entity-framework


    【解决方案1】:
    Var event1 = new EventType();
    event1.id = 1
    
    Var event2 = new EventType();
    event2.id = 1
    

    上面的代码 sn-p 表示您想在事件表中添加两行,其主键值相同为 1,这在数据库中是不可能的,因为主键始终具有唯一约束。

    如何添加包含具有相同主键但没有子对象的对象列表?

    上面的句子不是很清楚,但如果它针对相同的事件附加到多个 Races 那么它可以像下面那样完成。

    Var event1 = new EventType();
    event1.id = 1
    
    Race race1 = new Race();
    race1.id = 99;
    race1.EventType = event1;
    
    Race race2 = new Race();
    race2.id = 100
    race2.EventType = event1;
    

    然后调用context.SaveChanges()

    【讨论】:

    • Janish,感谢您的回答,但如前所述,我无法执行您的建议,因为数据作为不同的对象传给我。我想知道使用具有相同 id 的子对象插入多个父对象的最佳方法是什么。
    • @Atomic800 数据库中根本不可能有两个具有相同主键的对象/行,除非它是组合主键。如果您希望使用相同的主键来跟踪 raceeventtype 对象之间的关系,那么上述解决方案应该可以工作。
    • 我了解数据库主键的概念。我要问的问题是如何最好地实现不尝试使用实体框架插入重复的子对象?
    猜你喜欢
    • 1970-01-01
    • 2011-11-28
    • 2017-07-28
    • 2022-11-19
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多