EF Core指定具有引用值的引用表的前键

时间:2018-09-16 00:20:11

标签: ef-core-2.1

假设我有以下实体。

item.append(click.prompt("Name", default = '') if click.prompt("Name", default = '') else '** empty **')

Test Type是一个枚举,但是我想在数据库中有一个带有该枚举值的引用表。为此,我创建了一个由EF核心创建的TestTypeEntry实体,并从TestType枚举中的值中植入它。

public class TestData
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    public TestType Type { get; set; }
}

现在,我只想使用Fluent API在TestData.Type(枚举)和测试类型条目表的TestTypeID之间创建外键约束。

这个问题似乎是由于使用枚举作为实体的值并且希望在数据库中拥有一个引用表来反映这些值并具有外键关系的结果。除非我以错误的方式进行操作,否则我所缺少的就是使用流畅的API为参考表创建外键约束。

public class TestTypeEntry
{
    public int TestTypeEntryID { get; set; }
    public String TestTypeName { get; set; }
}

我知道上面的代码不起作用(只是试图让我对所要查找的内容有所了解)。

1 个答案:

答案 0 :(得分:0)

使用EnumToNumberConverter value conversion

类似的东西:

var converter = new EnumToStringConverter<TestType>();

modelBuilder
    .Entity<TestData>()
    .Property( td => td.Type )
    .HasConversion( converter );

编辑:

在评论后,我理解问题在于您在DbContext中有要枚举的表,但只是希望使用Enum来分配值。首先,如评论中所述,我不喜欢该决定,因为它需要维护两个位置的数据-数据库表和Enum代码。

但是,您可以通过单独使用没有导航属性的外键属性,将设置器标记为private,然后使用Enum类型的EF忽略属性来完成所需的操作与Enum之间的转换:

public class TestData
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Position { get; set; }
    // FK, private setter
    public int TestTypeEntryId { get; private set; }
    // enum property that EF will ignore
    public TestType Type
    {
        get => ( TestType )TestTypeEntryId;
        set => TestTypeEntryId = ( int )value;
    }
}

TestData的模型配置

        builder.HasOne<TestTypeEntry>()
            .WithMany()
            .HasForeignKey( d => d.TestTypeEntryId );

        builder.Ignore( d => d.Type );

请注意,使用Enum不会阻止设置无效值。