【问题标题】:Navigation property is not being created in run time Entity framework导航属性未在运行时实体框架中创建
【发布时间】:2012-09-11 19:07:52
【问题描述】:

我有一个 Quest 和 QuestTemplate 类,如下所示

public class Quest{

    public int ID {get;set;}

    public virtual QuestTemplate QuestTemplate {get;set;}

    public string Name{get;set;}
}

public class QuestTemplate{

    public int ID {get;set;}

    public QuestTemplate QuestTemplate {get;set;}

    public string Name{get;set;}

    public virtual Quest Quest{get;set;}
}

我在运行时创建如下所示的 Quest 和 QuestTemplate

Quest q = new Quest();
q.Name = "Foo";
q.QuestTemplate = new QuestTemplate();
q.QuestTemplate.Name = "Bar";

context.Quests.Add(q);
context.SaveChanges();

它将任务对象和任务模板对象添加到相关表中(本例中为任务,任务模板)。但是问题是表中任务模板对象的 Quest_ID 列没有设置任务对象的 ID。相反,它保持为空。我该如何解决这个问题?

P.S:我首先使用带有代码的 EF5。

最好的问候,

凯末尔

【问题讨论】:

  • 是否覆盖数据库默认的 EF 映射配置?
  • nop 我没有做任何特别的事情......我刚刚使用 modelBuilder.Entity().HasRequired(e => e.QuestTemplate).WithRequiredPrincipal().WillCascadeOnDelete(true ); OnModelCreating 方法。

标签: c# entity-framework entity-framework-5


【解决方案1】:

您在代码中没有指定QuestTemplate 应用于Quest 对象。以下代码应该可以工作:

Quest q = new Quest();
q.Name = "Foo";

QuestTemplate qt = new QuestTemplate();
qt.QuestTemplate.Name = "Bar";
qt.Quest = q;

q.QuestTemplate = qt;

context.Quests.Add(q);
context.SaveChanges();

或者您可以映射一对一的关系。

modelBuilder.Entity<Quest >()
    .HasRequred(q => q.QuestTemplate)
    .WithRequiredPrincipal()
    .WillCascadeOnDelete();

编辑

今晚看了这个,关系不是映射的原因是关于 FK 名称。如果您在 fluent 映射中指定 FK,则关系按预期工作。此外,这种类型的一对一关系需要先加载QuestQuestTemplate(因为它是必填字段)我在下面随机选择了QuestTemplate

public class DataContext : DbContext
{
    public DbSet<Quest> Quests { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Quest>()
            .HasOptional(q => q.QuestTemplate)
            .WithRequired(qt => qt.Quest)
            .Map(m => m.MapKey("QuestId"));
    }
}

public class Quest
{
    public int QuestId { get; set; }
    public string Name { get; set; }
    public virtual QuestTemplate QuestTemplate { get; set; }
}

public class QuestTemplate
{
    public int QuestTemplateId { get; set; }
    public string Name { get; set; }
    public virtual Quest Quest { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (DataContext db = new DataContext())
        {
            Quest q = new Quest { Name = "Bar" };
            q.QuestTemplate = new QuestTemplate { Name = "Foo" };
            db.Quests.Add(q);
            db.SaveChanges();
        }
    }
}

我认为这与标题为 Foreign Keys here 的部分有关,但我仍然不清楚这是为什么。我有其他关系以完全相同的方式配置,但没有识别 FK。

【讨论】:

  • 如果你看我的评论,我已经在我的模型构建器上完成了一对一关系的映射:(
  • 您是否实施了解决方案的第一部分?
  • 是的,当我这样做时,它会起作用。但我不明白的是,它不应该在运行时自动映射吗?
猜你喜欢
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多