如何初始化与另一个实体具有一对一关系的新对象,然后将该新对象添加到数据库中?

Posted

技术标签:

【中文标题】如何初始化与另一个实体具有一对一关系的新对象,然后将该新对象添加到数据库中?【英文标题】:How do I initialise a new object that has a one-to-one relationship to another entity and then add that new object to the database? 【发布时间】:2012-02-21 11:47:53 【问题描述】:

我刚刚开始掌握 Entity Framework 4 的窍门,但我仍然在努力解决一些问题,这个问题是最新的,我想知道是否有人会这么好心地指出我正确的方向?

我的模型中有许多相当简单的实体,但其中一个实体与另一个实体定义了一对一的关系,我似乎无法找到正确的事件序列来添加该实体的新实例实体到数据库成功。

一个简化的例子

我有一个 Student 实体和一个 Nationality 实体和一个 Student 与国籍是一对一的关系

我正在创建一个新的学生实体以添加到数据库中,并且 如果不先设置一个国籍来满足我就无法坚持下去 一对一的关系。

我在数据库中有一个“未知”国籍作为我的国籍实体之一,我希望这是我的新学生记录的初始值。

如何创建新学生,创建对“未知”国籍实体的初始引用,然后将新学生记录添加到数据库中,以使一切都按正确的顺序发生?

我只是使用与模型一起生成的标准类,我看过 STE 和 POCO 类型,但我决定退后一步,先学习基础知识。

【问题讨论】:

【参考方案1】:

不知道你用的是什么“口味”的EF。以下是使用 EF Code First 的方法: 首先是您的实体:

public class Student

    public int Id  get; set; 
    public string Name  get; set; 
    public virtual Nationality Nationality  get; set; 


public class Nationality

    public int Id  get; set; 
    public string Name  get; set;         

在这种情况下,关系非常简单,您不需要任何EntityTypeConfiguration。 您可以按此顺序添加记录:

var nationalities = new List<Nationality>()new Nationality()Name ="Italian",
                                                        new Nationality()Name ="British", 
                                                        new Nationality()Name ="American";

nationalities.ForEach(x => context.Nationality.Add(x));
context.SaveChanges();

//retrieve the nationality from the context
var italianNationality = context.Nationality.Where(x => x.Name == "Italian").First();
//create the student and assign a nationality
var student = new Student()  Name = "Giorgio", Nationality = italianNationality ;
context.Students.Add(student);
context.SaveChanges();

这是您的表结构(学生表包含国籍的 FK)

这里是插入的结果:

这里有更多关于 Code First 的信息: http://weblogs.asp.net/scottgu/archive/2010/07/16/code-first-development-with-entity-framework-4.aspx 在这里:http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-code-first-walkthrough.aspx

【讨论】:

非常感谢Giorgio的详细回复,我首先使用的是Model,但我可以按照您的操作进行操作。我试试看。 我仍然收到以下异常“来自‘StudentNationalityCode’AssociationSet 的关系处于‘添加’状态。鉴于多重约束,相应的‘NationalityCode’也必须处于‘添加’状态。”我将尝试制作一个小型测试应用来诊断这个问题。 我已经在一个孤立的项目中尝试了您的解决方案,它完美地运行了 Giorgio,所以我的问题必须在其他地方 - 但是这个问题已经得到解答,再次感谢您的帮助。

以上是关于如何初始化与另一个实体具有一对一关系的新对象,然后将该新对象添加到数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取所有对象A的一对多关系B的所有属性的NSSet

如何使用 JDBI SQL 对象 API 创建一对多关系?

如何更新CoreData中另一个实体的子实体

CoreData 关系延迟加载?

如何删除/替换有序对多 CoreData 关系中的对象?

GAE ndb 存储大型一对多关系的最佳实践