具有 Entity Framework 核心的可翻译模型
Translatable models with Entity Framework Core
我正在将我的 php 应用程序迁移到使用 Entity Framework Core 的 .net 核心应用程序。
我的几个模型都有来自 translations
table 的翻译链接。模型链接到翻译的方式是 modelname
和 modelid
。 modelname
是 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.
更多信息在这里:
据我所知,EF 确实提供了可能有帮助的功能,即 EF 提供了基于条件的多态性。您可以使用 "Translations" 作为 table 基础实现模型 class,让 Products/Stores/Publishers 从模型继承,并定义实例化 Product/Store/Publisher 的条件基于 "model_name" 字段。
我不完全确定,但在子 classes 中,您可以将这些导航器属性定义为仅与一种类型相关。
这是指南:
我用来解决这个问题的方法是添加一个新的 table、Translatables
。每个 table 即 translatable 现在都有一个字段 translatable_id
并且所有翻译都链接到 Translatable
.
我正在将我的 php 应用程序迁移到使用 Entity Framework Core 的 .net 核心应用程序。
我的几个模型都有来自 translations
table 的翻译链接。模型链接到翻译的方式是 modelname
和 modelid
。 modelname
是 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.
更多信息在这里:
据我所知,EF 确实提供了可能有帮助的功能,即 EF 提供了基于条件的多态性。您可以使用 "Translations" 作为 table 基础实现模型 class,让 Products/Stores/Publishers 从模型继承,并定义实例化 Product/Store/Publisher 的条件基于 "model_name" 字段。
我不完全确定,但在子 classes 中,您可以将这些导航器属性定义为仅与一种类型相关。
这是指南:
我用来解决这个问题的方法是添加一个新的 table、Translatables
。每个 table 即 translatable 现在都有一个字段 translatable_id
并且所有翻译都链接到 Translatable
.