具有 Entity Framework 核心的可翻译模型

Translatable models with Entity Framework Core

我正在将我的 php 应用程序迁移到使用 Entity Framework Core 的 .net 核心应用程序。

我的几个模型都有来自 translations table 的翻译链接。模型链接到翻译的方式是 modelnamemodelidmodelname 是 class 的名称,id 是该对象的 ID。请记住,一个对象可以有多个翻译和一个独特的 slug。
我想知道是否可以使用 entity framework 轻松实现它。所以模型通过它们的 id 链接,但也根据它们自己的 class 名称进行过滤。我是否必须为每个模型创建流利的关系 api 还是有更好的解决方案?

下面是数据库的一个小例子。但是在真实的数据库中,有更多的 table 有翻译。当然,如果需要,可以修改数据库。

看来你是想用TPC策略实现多态关联

很遗憾,当前版本的 EF Core 2.0 不支持 TPC,该功能计划在 EF Core 2.1 中发布 - https://github.com/aspnet/EntityFrameworkCore/wiki/Roadmap

这是适用于 EF 6.0 的解决方案:

public class Context : DbContext
{

    public Context() : base()
    {

    }

    public IDbSet<Translation> Translations { get; set; }

    public IDbSet<TranslatedModel> TranslationModels { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Store>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Stores");
            });

        modelBuilder.Entity<Publisher>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("Publishers");
            });

        modelBuilder.Entity<Translation>()
            .HasRequired(t => t.TranslatedModel)
            .WithRequiredDependent(t => t.Translation);
    }
}

public class Translation
{
    public int Id { get; set; }

    public string Value { get; set; }

    public TranslatedModel TranslatedModel { get; set; }
}

public abstract class TranslatedModel
{
    public int Id { get; set; }

    public Translation Translation { get; set; }
}

public class Store : TranslatedModel
{
    public int Website { get; set; }

}

public class Publisher : TranslatedModel
{
    public string Website { get; set; }
}

这里的问题是您可能对产品和商店使用相同的 ID,从而导致冲突。所以我建议不要将 model_id 和 model_name 作为参考键,只需将您的 ids 类型从 int 更改为 GUID 并删除 model_name.

更多信息在这里:

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

据我所知,EF 确实提供了可能有帮助的功能,即 EF 提供了基于条件的多态性。您可以使用 "Translations" 作为 table 基础实现模型 class,让 Products/Stores/Publishers 从模型继承,并定义实例化 Product/Store/Publisher 的条件基于 "model_name" 字段。

我不完全确定,但在子 classes 中,您可以将这些导航器属性定义为仅与一种类型相关。

这是指南:

https://docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

我用来解决这个问题的方法是添加一个新的 table、Translatables。每个 table 即 translatable 现在都有一个字段 translatable_id 并且所有翻译都链接到 Translatable.