【问题标题】:Entity Framework two tables with identical objects具有相同对象的实体框架两个表
【发布时间】:2019-08-22 17:30:46
【问题描述】:

我有两个具有相同属性的表,例如:

DbSet<Person> Students;
DbSet<Person> Teachers;

但是,Entity Framework 不允许将同一个类用于不同的表。

所以,我改用:

DbSet<Student> Students;
DbSet<Teacher> Teachers;

public class Student : Person { }
public class Teacher : Person { }

但是,如果我从第三方检索,一大组数据为

List<Person> data;

我做不到

Students.Add(data) <== compile time error unable to convert

也没有

foreach (var item in data)
    Students.Add((Student)item); <== runtime error unable to cast

对处理这个问题的好方法有什么建议吗?

注意:这是一个简单的示例,它实际上用于大量股票价格柱,性能是一个大问题,如果我能提供帮助,我不一定要实例化一个对象的很多很多副本。

【问题讨论】:

  • 是的,我并不惊讶这不起作用。即使具有相同的属性,它也不知道可以将 Person 转换为 Student。一种想法是将 Person 序列化为 json 字符串,然后将其反序列化为 Student。这需要两行代码,而且应该很快,
  • 您可以创建一个新接口IPerson,并让StudentTeacherPerson 都实现IPerson。然后将您的收藏更改为List&lt;IPerson&gt;
  • 另外,您不能使用Add 方法将一个集合添加到另一个集合。 Add 需要一个元素。你想要的是AddRange 方法。
  • 你可以使用ReinterpretCast from this answer,但这是一种类型安全违规。

标签: c# entity-framework downcast


【解决方案1】:

我们需要更多关于如何创建 List&lt;Person&gt; 以获得完全有效的答案的详细信息,但如果您通过添加 StudentTeacher 对象来创建它,那么您应该能够投射实际 Students 在运行时:

List<Person> people = new List<Person>();
people.Add(new Student());
people.Add(new Teacher());
foreach(Student student in people.OfType<Student>())
{
    Students.Add(student);
}

我也会制作 Person abstract 所以你不得不使用其中一种具体类型。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多