我有一个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和QuestTemplateQuest 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代码。
致以最诚挚的问候,
末尔
答案 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,则关系将按预期工作。此外,这种一对一关系要求Quest
或QuestTemplate
首先加载到另一个(因为它是必填字段)我随机选择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的情况下,我有其他关系以完全相同的方式配置。