我正在使用Entity Framework Core将我的php应用程序迁移到.net核心应用程序。
我的几个模型都有来自translations
表格的翻译链接。模型与翻译的关联方式是modelname
和modelid
。 modelname
是类的名称,id是该对象的id。请记住,一个对象可以有一个独特的slug多个翻译
我想知道是否可以使用实体框架轻松实现这一点。因此模型按其ID链接,但也按自己的类名进行过滤。我是否必须为每个模型在流畅的api中创建这种关系,还是有更好的解决方案?
以下是数据库外观的一个小例子。但在真实数据库中,还有许多表具有翻译。当然,如果需要,可以修改数据库。
答案 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。
更多信息:
答案 1 :(得分:0)
据我所知,EF DOES提供的可能有用的是EF根据条件提供多态性。您可以使用&#34; Translations&#34;来实现Model类。作为表格基础,让Products / Stores / Publishers继承自Model,并定义产品/商店/发布者实例化的条件基于&#34; model_name&#34;字段。
我不完全确定,但在子类中,您可以将这些导航器属性定义为仅与一种类型相关。
以下是指南:
答案 2 :(得分:-1)
我用来解决此问题的解决方案是添加一个新表Translatables
。现在,每个可翻译的表都有一个字段translatable_id
,所有翻译都链接到Translatable
。