实体框架代码第一个外键问题

时间:2014-04-15 16:34:45

标签: entity-framework ef-code-first

我正在尝试在现有数据库上使用EF Code First。我首先尝试了一些逆向工程工具,但我遇到了问题,所以目前我正在尝试手工编写一些类。我在设置一些外键关系时遇到了一些麻烦。考虑两个表。第一个叫做LocaleValueLookup:

public class LocaleValueLookup
{
    public int Id { get; set; }
    public Guid Guid { get; set; }
}

此表提供了在不同表中保存的多语言文本的ID(其他表对于此问题的目的并不重要)。第二个表称为SectionType,它有一个可选的FK到LocaleValueLookup:

public class SectionType
{
    public int EnumId { get; set; }
    public string Name { get; set; }
    public int? DefaultSectionTextLocaleValueLookupId { get; set; }

    // Navigation property
    public LocaleValueLookup DefaultSectionTextLocaleValueLookup { get; set; }
}

我尝试了各种各样的事情,包括在SectionType.LocaleValueLookup属性中添加[ForeignKey]属性,在DbContext.OnModelCreating()覆盖中添加各种咒语,但是当我查询DbContext时,,我无法获得DefaultSectionTextLocaleValueLookup是null。我可以从上下文中检索其他对象,我已经验证DefaultSectionTextLocaleValueLookupId至少在某些时候不是null。

我的OnModelBuilding()包含以下内容:

modelBuilder.Entity<LocaleValueLookup>()
    .ToTable("LocaleValueLookup")
    .HasKey(lvl => lvl.Id);
modelBuilder.Entity<LocaleValueLookup>().Property(lvl => lvl.Id).IsRequired();

modelBuilder.Entity<SectionType>()
    .ToTable("SectionType")
    .HasKey(st => st.EnumId);
modelBuilder.Entity<SectionType>().Property(st => st.EnumId).IsRequired();

其他几点:

  • 我不希望LocaleValueLookup对象上有SectionType集合。 LocaleValueLookup是许多其他类所依赖的低级类,因此要在LocaleValueLookup上包含一个集合属性,以便引用它的每个其他类都会使一个笨重的类上面有很多我不需要的集合从域的角度来看。
  • 我更喜欢在DbContext.OnModelCreating()中进行映射设置,而不是在我的模型对象上使用属性

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

看起来你的外键是可空的,这意味着一个可选的 - &gt;很多关系。

你可以尝试这样的事情:

modelBuilder.Entity<SectionType>()
    .HasOptional(opt => opt.DefaultSectionTextLocaleValueLookup)
    .WithMany() // no navigation on the other side
    .HasForeignKey(fk => fk.DefaultSectionTextLocaleValueLookupId);

如果你要编写这样的查询,你应该得到一个值:

var query = 
    from st in db.SectionTypes
    where st.EnumId == 12345
    select new
    {
        SectionType = st,
        LocaleValue = st.DefaultSectionTextLocaleValueLookup
    };

如果外键显然具有值,它将仅为非null。