实体框架6:将子对象添加到父级列表与将子级的导航属性设置为父级

Joe*_*erg 13 c# asp.net entity-framework entity-framework-6

我有两个表的现有数据库MailServers,并MailDomains在里面.MailDomains具有MailServerId指向Id主键列的外键列MailServers.所以我们在这里有一对多的关系.

我遵循了本文,并通过实体数据模型向导中的"首先从数据库中获取代码"模型创建了我的实体框架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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是以下两种创建新对象并将其插入数据库的方法之间是否存在任何差异.

方法(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();
        }
Run Code Online (Sandbox Code Playgroud)

方法(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();
        }
Run Code Online (Sandbox Code Playgroud)

我还假设在方法(A)中,新MailDomain实例自动添加到集合中,context.MailDomains而在方法(B)中,新MailServer实例自动添加到集合中context.MailServers.这是正确的还是我必须手动完成?

所以,我的问题是:这两种方法是否可以互换?它只是让我感到困惑的是,在数据库中只有一个属性/列要设置(即外键MailDomains),而在C#代码中有两个属性(每个类中有一个)可以修改.

Phi*_*ler 6

是的,这两种方法是可以互换的.这允许您从MailServer或MailDomain的角度创建对象图并将其保存到数据库.

如果您执行代码优先,则可以选择在不需要时删除属性和映射.

我还假设在方法(A)中,新的MailDomain实例自动添加到context.MailDomains,而在方法(B)中,新的MailServer实例自动添加到context.MailServers.这是正确的还是我必须手动完成?

这取决于"添加到上下文"的含义.如果你的意思是:当你坚持下去时它会自动保存到数据库中,答案是肯定的.使用像EF这样的ORM的一大好处是它可以自动处理保存完整的对象图(以及同步PK/FK关系等).

如果你的意思是:在保存之前,实体是否可以通过上下文获得,我不这么认为(我不是100%肯定).