导航属性未在运行时实体框架中创建

时间:2012-09-11 19:07:53

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

我有一个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,QuestTemplates)。但是问题是表中的任务模板对象的Quest_ID列没有设置任务对象的ID。相反,它仍然是空的。我该如何解决这个问题?

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

致以最诚挚的问候,

末尔

1 个答案:

答案 0 :(得分:0)

您在代码中没有指定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的情况下,我有其他关系以完全相同的方式配置。