使用两个导航属性映射相同的集合

时间:2015-07-27 12:40:32

标签: entity-framework ef-fluent-api

我有以下型号

public class Locale
{ 
    public int Id { get; set; }
    public ICollection<Localization<Locale>> Localizations { get; set; }
}

public class Localization<T>
{
    public int Id { get; set; }
    public Locale Locale { get; set; }
    public string DisplayName { get; set; }
    public T Entity { get; set; }
}

在这种情况下,我希望能够本地化任何实体,包括本地化本身(即:用于我们以用户语言显示可用语言的地方)。

我在NHibernate工作,但我需要转向EF。当我想使用流畅的API将其映射如下时,会出现问题。

modelBuilder.Entity<Locale>()
            .HasMany(x => x.Localizations)
            .WithRequired(x => x.Locale)
            .Map(x => x.MapKey("LocaleId"));

这有效,但我需要映射实体本身。 这样做会覆盖上一个地图。

modelBuilder.Entity<Locale>()
            .HasMany(x => x.Localizations)
            .WithRequired(x => x.Entity)
            .Map(x => x.MapKey("EntityId"));

这样做会在任一字段上抛出错误(我还尝试创建一个名为LocaleLocalization的Localization子类,结果相同)。

 modelBuilder.Entity<Localization<Locale>>()
             .HasRequired(x => x.Entity)
             .WithMany()
             .Map(x => x.MapKey("LCIDLocale"))

错误

  

导航属性“Entity”不是类型的声明属性   本土化。验证它是否未从模型中明确排除   并且它是一个有效的导航属性。

1 个答案:

答案 0 :(得分:0)

解决方案是我需要映射两个集合,一个表示此Locale的Localizations集合,另一个表示本地化为此语言环境的其他Locales集合。

ICollection<Localizations> MyLocalizations { get; set; }
ICollection<Localizations> LocalesLocalizedByMe { get; set; }