【发布时间】:2021-12-28 18:48:05
【问题描述】:
我目前正在做一个代码优先的小项目:我必须创建一个电影数据库,并且像往常一样,每部电影可以有多个流派 (m:n)。由于流派是不变的,我决定创建一个包含所有流派的枚举类型。
在Movie 表中,我有一个流派列表(枚举)。显然这是错误的,因为您无法在数据库中存储枚举列表。
于是我开始寻找答案。我遇到了很多解决方案,不幸的是它们都没有真正帮助我。所以我决定问这个问题。我知道这可能是重复的,但其他解决方案并没有真正的帮助。
我发现的一些解决方案是Flags 和SmartEnum。
我都试过了,但它并没有真正奏效。您能否看看我的代码并告诉我我做错了什么,或者是否有其他方法可以转换枚举列表。
电影:
class Serie
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
[MaxLength(255)]
public string Titel { get; set; } = "";
public virtual List<Genres> Genres { get; } = new();
}
类型:
public sealed class Genres : SmartEnum<Genres>
{
public static readonly Genres Drama = new(name: "Drama", value: 1);
public static readonly Genres Crime = new(name: "Crime", value: 2);
...
private Genres(string name, int value) : base(name, value)
{ }
}
PS:我知道我可以通过额外的课程来做到这一点,但我想用枚举来做到这一点。
【问题讨论】:
-
在 3nf 中,您将拥有一个充当多对多的表,我们称之为 MovieGenres。这将具有 MovieId 和 GenreId。您没有 Genre 表并不重要,但它会使您的代码和架构更容易阅读,我个人的偏好是将其存储在数据库中以便您可以更改它(例如更改名称或添加一种流派)。
-
我知道我可以通过额外的课程来做到这一点,但我想用枚举来做到这一点。
-
就像我说的,这是我的偏好。我没有说你必须那样做。同样,使用表来存储关系并将其视为多对多,即使一端没有 FK,因为 Genre 值保留在代码库中而不是数据库中。基本策略不会改变。
-
“因为流派是不变的”——它们不是。新流派偶尔会出现。 Cyberpunkg 在我上学的时候是新的,那实际上可以追溯到一本名为cyberpunk的书。
-
你可以看看创建enum lookup table
标签: c# entity-framework enums code-first