我有多个课程
X, Y, Z
:
public class X
{
public int Id { get; set; }
public virtual List<Image> Images { get; set; }
}
public class Y
{
public int Id { get; set; }
public virtual List<Image> Images { get; set; }
}
public class Z
{
public int Id { get; set; }
public virtual List<Image> Images { get; set; }
}
每个类与
one-to-many
类都有 Image
关系。
我想创建一个可以引用所有这些类的列
X, Y, Z.
这是我的
Image
课程:
public class Image
{
public int Id { get; set; }
public int RefId { get; set; }
public virtual X X { get; set; }
public virtual Y Y { get; set; }
public virtual Z Z { get; set; }
}
这是最小化外键数量的好方法吗?或者我可以尝试其他一些方法来使我的获取查询更快吗?
我的 Fluent API 还需要进行哪些更改?
X、Y、Z 的同一列不起作用,因为
RefId
位于 Image
中。考虑一下:一个带有 Image
的 RefId = 1
,并且 X/Y/Z 都有带有 Id = 1
的数据,Image
不会知道它是否应该与 X、Y 或 Z 关联。
此外,如果新表
K
使用Image
怎么办?然后,每次新表使用它时,您都需要在 K
中为 Image
添加新列。
重新考虑要求。您真的需要从
Image
访问 X/Y/Z 吗?对于类似的用例,通常我仅通过 X/Y/Z 实例访问 Image
。
如果您仍然想保留结构,仅 C# 的属性可能会让事情变得更容易一些:
// ...
// Make X, Y, Z all inherit SomeInterface first
// ...
public class Image
{
public int Id { get; set; }
public int RefId { get; set; }
public virtual X X { get; set; }
public virtual Y Y { get; set; }
public virtual Z Z { get; set; }
public IEnumerable<SomeInterface> Things => new [] {X,Y,Z}.Where(si => si != null).ToArray();
}
不过,我建议重新考虑整个结构。