我有一个现有数据库,其中包含两个表MailServers
和MailDomains
。 MailDomains
的外键列MailServerId
指向Id
中的MailServers
主键列。所以我们在这里有一对多的关系。
我跟着this article并通过实体数据模型向导中的“首先从数据库中获取代码”模型创建了我的实体框架POCO。这产生了以下两个C#类:
public partial class MailServer
{
public MailServer()
{
MailDomains = new HashSet<MailDomain>();
}
public int Id { get; set; }
public virtual ICollection<MailDomain> MailDomains { get; set; }
}
public partial class MailDomain
{
public MailDomain()
{
}
public int Id { get; set; }
public string DomainName { get; set; }
public int MailServerId { get; set; }
public virtual MailServer MailServer { get; set; }
}
现在我的问题是以下两种创建新对象并将其插入数据库的方法是否有任何区别。
方法(A):将新子项添加到父列表中:
var mailServer = new MailServer();
var mailDomain = new MailDomain() {
DomainName = "foobar.net",
};
mailServer.MailDomains.Add(mailDomain);
using(var context = new MyContext){
context.MailServers.Add(mailServer);
context.SaveChanges();
}
方法(B):将子项的导航属性设置为父项:
var mailServer = new MailServer();
var mailDomain = new MailDomain() {
DomainName = "foobar.net",
MailServer = mailServer,
};
using(var context = new MyContext){
context.MailDomains.Add(mailDomain);
context.SaveChanges();
}
我还假设在方法(A)中,新的MailDomain
实例会自动添加到集合context.MailDomains
中,而在方法(B)中,新的MailServer
实例会自动添加到集合context.MailServers
中。集合MailDomains
。这是正确的还是我必须手动完成?
所以,我的问题是:这两种方法是否可以互换? 它只是让我感到困惑的是,在数据库中只有一个属性/列要设置(即{{1}}中的外键),而在C#代码中有两个属性(每个类中有一个)可以修改。 / p>
答案 0 :(得分:6)
是的,这两种方法是可以互换的。这允许您从MailServer或MailDomain的角度创建对象图并将其保存到数据库。
如果您执行代码优先,则可以选择删除属性和映射(如果不需要)。
我还假设在方法(A)中新的MailDomain实例是 在进近(B)时自动添加到context.MailDomains 新的MailServer实例自动添加到context.MailServers。 这是正确的还是我必须手动完成?
这取决于你的意思&#34;添加到上下文&#34;。如果你的意思是:当你坚持下去时它会自动保存到数据库中,答案是肯定的。使用像EF这样的ORM的一大好处是它可以自动处理保存完整的对象图(以及同步PK / FK关系等)。
如果您的意思是:在保存之前,实体是否可以通过上下文获取,我不这么认为(我不是100%肯定)。