Entity framework 实体框架代码优先外键问题

Entity framework 实体框架代码优先外键问题,entity-framework,ef-code-first,Entity Framework,Ef Code First,我试图在现有数据库上首先使用EF代码。我首先尝试了一些逆向工程工具,但是我遇到了一些问题,所以目前我正在尝试手工编写一些类的代码。我在建立一些外键关系时遇到了一些问题。考虑两个表。第一种称为LocaleValueLookup: public class LocaleValueLookup { public int Id { get; set; } public Guid Guid { get; set; } } public class SectionType { pu

我试图在现有数据库上首先使用EF代码。我首先尝试了一些逆向工程工具,但是我遇到了一些问题,所以目前我正在尝试手工编写一些类的代码。我在建立一些外键关系时遇到了一些问题。考虑两个表。第一种称为LocaleValueLookup:

public class LocaleValueLookup
{
    public int Id { get; set; }
    public Guid Guid { get; set; }
}
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; }
}
此表为保存在不同表中的多语言文本提供Id(就本问题而言,其他表并不重要)。第二个表称为SectionType,它有一个可选的FK到LocaleValueLookup:

public class LocaleValueLookup
{
    public int Id { get; set; }
    public Guid Guid { get; set; }
}
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

My 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();
modelBuilder.Entity()
.ToTable(“LocaleValueLookup”)
.HasKey(lvl=>lvl.Id);
modelBuilder.Entity().Property(lvl=>lvl.Id).IsRequired();
modelBuilder.Entity()
.ToTable(“截面类型”)
.HasKey(st=>st.EnumId);
modelBuilder.Entity().Property(st=>st.EnumId.IsRequired();
还有几点:

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

任何帮助都将不胜感激

看起来您的外键可以为空,因此这意味着一个可选->多关系

你能试试这样的吗

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

显然,只有当外键有值时,它才会是非空的。

这样做时,我会收到一个错误:列名“LocaleValueLookup\u Id”无效。我本以为HasForeignKey电话会处理好的。正在运行的SQL是这样的:从[dbo].[SectionType]中选择TOP(1)[Extent1].[EnumId]作为[EnumId],[Extent1].[Name]作为[Name],[Extent1].[DefaultSectionTextLocalEvaleLookupId]作为[DefaultSectionTextLocalEvaleLookupId],[Extent1].[LocalEvaleLookupId]作为[LocalEvaleLookupId],其中3=[Extent1].[EnumId]您是否从实体中删除了[ForeignKey]属性?是的,我删除了;SectionType表上没有[ForeignKey]注释。不确定您的解决方案最初为什么不起作用,但当我从头开始一个新项目时,它工作得很好。