我必须重用现有的数据库,并且必须使用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范式,但是不允许更改数据库。
答案 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();