gpt4 book ai didi

c# - Entity Framework 的 TPC 继承问题

转载 作者:行者123 更新时间:2023-11-30 17:18:59 28 4
gpt4 key购买 nike

我有 2 个对象,我想将它们分别存储在 2 个不同的表中。我们将类称为 Foo 和 FooTemp。

我正在使用 Table Per Concrete Type (TPC) 继承,因为我希望类 FooTemp 扩展类 Foo 并且我希望数据单独存储。

两个表之间的唯一区别是 FooTemp 有一个额外的字段。

我关注了this guide for setting up TPC inheritance .唯一的区别是我的派生类中有一个额外的字段。

现在,这是我的问题。当我向数据库添加新记录时,出现错误:

"System.ArgumentException: An item with the same key has already been added"

为什么会出现此错误?有没有其他方法可以继承并将数据存储在单独的表中?

最佳答案

如果您在两个表中定义自动生成的身份 key ,我认为 TPC 存在问题。尽管从 SQL Server 的角度来看这不是问题(因为两个表是分开的,因此可以有具有相同键的记录) Entity Framework 不允许共享相同基类的两个对象具有相同的键值。但是,如果您在两个表上使用相同的身份种子(例如 1)自动生成 key ,则可能会发生这种情况。

我不确定这是否是您的问题。如果您从一个空的对象上下文开始,创建一个新的 FooFooTemp,将其添加到上下文并保存更改,我上面描述的问题就不会发生。

但它会发生在例如以下情况:

// Imagine, you know that there is a Foo with Key 1 already in the DB, or you
// could also query for that Foo to attach to the context
Foo foo = new Foo() { Key = 1 };
context.Foos.Attach(foo);
// Now, we have an object of type Foo with Key 1 in the object context

// Let's assume, that the table FooTemp in the DB is empty. We create the
// first FooTemp
FooTemp fooTemp = new FooTemp();
context.Foos.Add(fooTemp);

context.SaveChanges();
// If the FooTemp table has an autogenerated identity with seed 1 in the DB,
// our FooTemp gets Key 1 in the DB. Because Entity Framework accepts the
// DB changes after calling SaveChanges, our FooTemp object will now have
// the Key 1, so we have a second Foo (since FooTemp derives from Foo) with
// the same Key 1 in the same object context

我能看到的解决方法:

  • 为两个表的自动生成的标识定义不同的种子,这两个表距离足够远,因此它们不太可能重叠。
  • 关闭自动生成的身份并手动提供您的 key 。

关于c# - Entity Framework 的 TPC 继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5273106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com