处理复合外键的正确方法

问题描述 投票:0回答:1

我有多个课程

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 还需要进行哪些更改?

c# asp.net foreign-keys ef-code-first
1个回答
0
投票

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();
}

不过,我建议重新考虑整个结构。

© www.soinside.com 2019 - 2024. All rights reserved.