映射多态外键

时间:2013-09-17 14:29:37

标签: asp.net-mvc entity-framework asp.net-mvc-4

我必须重用现有的数据库,并且必须使用Microsoft的东西。 我们想在现有数据库之上创建一个asp.net MVC应用程序。 数据库设计如下(这是问题的简化)

Table: Students
  id
  ....

Table: Professors
  id
  ....

Table: Images
  id
  imageble_id
  imagable_type

学生和教授可以有多个图像,图像属于教授或学生。 在旧的应用程序中,你有一个人类,这是学生和教授的父母。

我的问题是将多态关系Image映射到学生和教授。 我不得不说我是asp.net mvc和实体框架的新手。但我似乎没有办法让这个工作。 当你这样做时:

Professor a = MyAppDbContext.Professors.find(1)
a.Images.add(new Image())

它在数据库中创建一个新图像

imageble_id = 1
imagable_type = "Professor"

我尝试使用数据库第一种方法建议定义自己的映射,但是我无法找到如何映射这个多态外键。

ps:我知道db不是因为这个而处于第3范式,但是不允许更改数据库。

1 个答案:

答案 0 :(得分:0)

我不明白你的问题......事实上,我在这里看不到任何问题......

将构造函数添加到Image类:

public Image(int id, string type)
{
    this.Id = id;
    this.Type = type;
}

然后,您的代码可能如下所示:

Professor a = MyAppDbContext.Professors.find(1);
a.Images.add(new Image(1, "Professor"));
MyAppDbContext.SaveChanges();

如果你正在创建教授:

Professor a = new Professor(...);
MyAppDbContext.Professors.Add(a);
MyAppDbContext.SaveChanges();

a.Images.add(new Image(a.Id, "Professor"));
myDbContext.SaveChanges();

更新:通过针对db的单个查询获取所有教授的图像。

如果您正确地声明了导航属性,那么您需要的是以下行,以便在一个数据库查询中创建内容的教授列表及其图像:

var ps = MyAppDbContext.Professors.ToList();

现在,例如,要获取教授的图像,您可以使用以下内容,它不会导致对db的查询(因为该集合存在于内存中):

var picsOfProf = ps.FirstOrDefault(p => p.Id == 1).Images.ToList();