0

我有一个 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();

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

PS:我首先使用带有代码的EF5。

此致,

凯末尔

4

1 回答 1

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,则关系按预期工作。此外,这种类型的 1 对 1 关系需要先加载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 的情况下以完全相同的方式配置了其他关系。

于 2012-09-11T19:36:36.747 回答