C# 如何将新的子实体添加到EF4中的父实体?

C# 如何将新的子实体添加到EF4中的父实体?,c#,entity-framework,.net-4.0,entity-framework-4,poco,C#,Entity Framework,.net 4.0,Entity Framework 4,Poco,我正在使用VS2010、.NET4.0、EntityFramework4和POCO实体。我正在尝试从父实体中添加和删除子实体。我在[用户]和[公司]之间有多对多关系。因此,我有以下实体: // Objects created by POCO template generator public class User { public int Id { get; set; } public string Username { get; set; } public IColle

我正在使用VS2010、.NET4.0、EntityFramework4和POCO实体。我正在尝试从父实体中添加和删除子实体。我在[用户]和[公司]之间有多对多关系。因此,我有以下实体:

// Objects created by POCO template generator
public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public ICollection<Company> Companies { get; set; }
}
public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<User> Users { get; set; }
}

如何添加子实体?(不创建重复关系?)。。。在对父用户执行“ApplyCurrentValues()”时,是否有一种简单的方法来更新这些子用户?

此代码有效,不会创建重复的用户

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public ICollection<Company> Companies { get; set; }

    public User()
    {
        Companies = new List<Company>();
    }
}

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class POCOEntitiesContext : ObjectContext
{
    private ObjectSet<User> users;
    public ObjectSet<User> Users
    {
        get { return users; }
    }

    private ObjectSet<Company> companies;
    public ObjectSet<Company> Companies
    {
        get { return companies; }
    }

    public POCOEntitiesContext() : base("name=POCOEntities", "POCOEntitiesContainer")
    {
        users = CreateObjectSet<User>();
        companies = CreateObjectSet<Company>();
    }
}

using (var ctx = new POCOEntitiesContext())
{
    var loadedUser = ctx.Users.Where(u => u.Username == "Peri").First();
    loadedUser.Companies.Add(new Company() { Name = "New Company" });
    ctx.SaveChanges();
}
公共类用户
{
公共int Id{get;set;}
公共字符串用户名{get;set;}
公共ICollection公司{get;set;}
公共用户()
{
公司=新列表();
}
}
公营公司
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
公共类PoCoEntityContext:ObjectContext
{
私有对象集用户;
公共对象集用户
{
获取{返回用户;}
}
私人对象集公司;
公共对象集公司
{
获取{返回公司;}
}
公共POCOEntitiesContext():基(“名称=POCOEntities”,“POCOEntitiesContainer”)
{
users=CreateObjectSet();
companys=CreateObjectSet();
}
}
使用(var ctx=new POCOEntitiesContext())
{
var loadedUser=ctx.Users.Where(u=>u.Username==“Peri”).First();
loadedUser.Companys.Add(新公司(){Name=“新公司”});
ctx.SaveChanges();
}

我尝试了一种更简单的方法,我发现:

    var newCompany = pocoObject.Companies.Last();
    newCompany.Users = null;
    loadedUser.Companies.Add(newCompany);
事实证明,因为在子对象中存在对父对象的引用,所以它正在向上传播,并导致创建一个新的父对象。因此,从POCO的角度来看,我必须删除父对象,并将其保持为一个非常简单的对象。(或者我可以在edmx中删除孩子的家长引用)。但即使这样,我的生活也变得更轻松:

    loadedUser.Companies.Add(new Company() { Name = "New Company" });

它应该会起作用。您是否在代码片段中遗漏了某些内容
IEnumerable
没有
Add
方法,因此您的
Save
方法将无法编译,因为您没有返回
用户
。我猜,这不是你的“真实”代码,是吗?对不起,POCO生成器创建了
ICollections
,我在代码片段中修复了它。顺便说一句,行
pocoObject.companys.Last()
是一个POCO对象,而不是一个被跟踪的实体。只是为了确保我理解:您想在数据库中插入一个新公司(
pocoObject.companys.Last()
是一个新公司,尚未存在于数据库中,对吗?)并在现有用户和这个新公司之间创建关系,对吗?是的,这是正确的。我想将新公司插入数据库,但它属于现有用户。您可以做一个小测试:在
保存
方法中创建另一个上下文
\u dbContext2
,并用
\u dbContext2
替换代码中的两个
\u dbContext
。在调试器中执行并直接在
\u dbContext2.SaveChanges()之后查看数据库表。如果这样做有效(没有用户复制),那么您至少知道在您的
\u dbContext
实例中发生了导致复制的其他情况。您知道,我尝试了这种更简单的方法,并找到了答案。事实证明,因为在子对象中存在对父对象的引用,所以它正在向上传播,并导致创建一个新的父对象。非常感谢你!!
    loadedUser.Companies.Add(new Company() { Name = "New Company" });