1

我正在使用实体框架核心将我的php应用程序迁移到.net核心应用程序。使用实体框架核心的可翻译模型

我的几个模型有从translations表中链接到他们的翻译。模型链接到翻译的方式是modelnamemodelidmodelname是类的名称,id是该对象的ID。请记住,一个对象可以有一个独特的slu multiple的多个翻译。
我想知道是否可以轻松实现这个使用实体框架。所以这些模型是通过它们的id链接的,但是也会根据它们自己的类名进行过滤。我是否必须为每个模型创建一个流畅的api关系,还是有更好的解决方案?

下面是数据库外观的一个小例子。但在真正的数据库中,还有更多的表格有翻译。当然,数据库可以根据需要进行修改。

enter image description here

回答

-1

我用来解决这个被增加一个新的表,Translatables溶液。每个现在可翻译的表格都有一个字段translatable_id,所有翻译都链接到Translatable

0

看来,要实现与TPC战略态关联。

不幸的是当前版本的EF核2.0不支持TPC和功能发行计划在EF核心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

0

我知道,EF确实提供可能的帮助是EF提供基于关闭的条件多态性。您可以使用“翻译”作为表基,实现一个Model类,让Products/Stores/Publishers从Model继承,并根据“model_name”字段定义产品/商店/发布商实例化的条件。

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

这里是在引导:

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

+0

问题在于他指的是EF Core,目前还不支持这种类型的继承。 –