gpt4 book ai didi

c# - Entity Framework : adding existing child POCO to new Parent POCO, 在数据库中创建新子项

转载 作者:太空狗 更新时间:2023-10-29 19:57:13 32 4
gpt4 key购买 nike

我想在断开连接(从上下文)模式下使用 Entity Framework POCO。在我的场景中,我正在创建一个新的父对象,并希望将现有的子对象附加到它,然后将它保存到数据库中。
下面的代码在保存新的学生记录时意外地插入了新的类(class)记录,而我希望现有的类(class)记录链接到新的学生记录。

我如何在 Entity Framework 中执行此操作...

  • 对象可以从上下文中断开。 (即在一个上下文中查询,然后在不同的上下文中保存)
  • 我不需要从数据库中重新查询子记录,这样我就可以在保存到数据库时将它附加到父记录。当我已经将它作为内存中的对象时,我真的想避免对数据库进行额外的访问。

此页面显示了一个数据库图,下面的代码基于 http://entityframeworktutorial.net/EF4_EnvSetup.aspx#.UPMZ4m-UN9Y

class Program
{
static void Main(string[] args)
{

//get existing course from db as disconnected object
var course = Program.getCourse();

//create new student
var stud = new Student();
stud.StudentName = "bob";

//assign existing course to the student
stud.Courses.Add(course);

//save student to db
using (SchoolDBEntities ctx = new SchoolDBEntities())
{
ctx.Students.AddObject(stud);
ctx.SaveChanges();
}
}

static Course getCourse()
{
Course returnCourse = null;

using (var ctx = new SchoolDBEntities())
{
ctx.ContextOptions.LazyLoadingEnabled = false;
returnCourse = (from s in ctx.Courses
select s).SingleOrDefault();
}

return returnCourse;
}
}

最佳答案

我相信实现这一目标的方法很少。您可以按照以下行指定类(class)实体未更改而不是添加:

ctx.Entry(course).State = EntityState.Unchanged;

或指示您的上下文,您正在使用现有实体:

ctx.Courses.Attach(course);

更多信息在这里: http://msdn.microsoft.com/en-us/data/jj592676.aspx

编辑

我的解决方案中有一些正在运行的示例,我验证了它们按预期工作。在所有情况下,我们在数据库中都有 ID = 2 和名称 = "Addison Wesley"的 Publisher 记录(与示例无关,但只是为了很好的衡量标准)。

方法 1 - 设置实体状态

using (var context = new Context())
{
var book = new Book();
book.Name = "Service Design Patterns";
book.Publisher = new Publisher() {Id = 2 }; // Only ID is required
context.Entry(book.Publisher).State = EntityState.Unchanged;
context.Books.Add(book);
context.SaveChanges();
}

方法 2 - 使用 Attach 方法

using (var context = new Context())
{
var book = new Book();
book.Name = "Service Design Patterns";
book.Publisher = new Publisher() { Id = 2 }; // Only ID is required
context.Publishers.Attach(book.Publisher);
context.Books.Add(book);
context.SaveChanges();
}

方法 3 - 设置外键值

using (var context = new Context())
{
var book = new Book();
book.Name = "Service Design Patterns";
book.PublisherId = 2;
context.Books.Add(book);
context.SaveChanges();
}

对于最后一种工作方法,我需要添加额外的属性 PublisherId,它必须根据 NavigationPropertyName + 'Id"约定命名,以便 EF 自动获取:

public int PublisherId { get; set; }
public Publisher Publisher { get; set; }

我在这里使用的是 EF5 Code First,但它与 POCO 非常相似。

关于c# - Entity Framework : adding existing child POCO to new Parent POCO, 在数据库中创建新子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307838/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com