具有实体框架核心的可翻译模型

时间:2017-09-08 08:28:37

标签: c# entity-framework asp.net-core ef-code-first polymorphic-associations

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

我的几个模型都有来自translations表格的翻译链接。模型与翻译的关联方式是modelnamemodelidmodelname是类的名称,id是该对象的id。请记住,一个对象可以有一个独特的slug多个翻译 我想知道是否可以使用实体框架轻松实现这一点。因此模型按其ID链接,但也按自己的类名进行过滤。我是否必须为每个模型在流畅的api中创建这种关系,还是有更好的解决方案?

以下是数据库外观的一个小例子。但在真实数据库中,还有许多表具有翻译。当然,如果需要,可以修改数据库。

enter image description here

3 个答案:

答案 0 :(得分:0)

您似乎希望与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作为引用键,只需将你的id类型从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

答案 1 :(得分:0)

据我所知,EF DOES提供的可能有用的是EF根据条件提供多态性。您可以使用&#34; Translations&#34;来实现Model类。作为表格基础,让Products / Stores / Publishers继承自Model,并定义产品/商店/发布者实例化的条件基于&#34; model_name&#34;字段。

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

以下是指南:

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

答案 2 :(得分:-1)

我用来解决此问题的解决方案是添加一个新表Translatables。现在,每个可翻译的表都有一个字段translatable_id,所有翻译都链接到Translatable