我正在尝试在现有数据库上使用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();
其他几点:
非常感谢任何帮助!
答案 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。