Как добавить новые дочерние объекты к родителю в EF4? - PullRequest
0 голосов
/ 24 октября 2011

Я работаю с объектами VS2010, .NET 4.0, Entity Framework 4 и 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; }
}

На данный момент в коде пользователь существует, но имеет нулевые компании.То, что я пытаюсь сделать, это добавить новую дочернюю компанию для пользователя.Этот код сохраняет компанию, но он также создает дубликат родительского элемента.

public UserRepository
{
    internal ObjectContextEntities _dbContext = new ObjectContextEntities();
    public User Save(User pocoObject)
    {
        // Load the existing User which has no companies
        var loadedEntity = _dbContext.Users.Where(m => m.Id == pocoObject.Id).FirstOrDefault();

        // Add the new company from a POCO object
        loadedEntity.Companies.Add(pocoObject.Companies.Last());

        _dbContext.SaveChanges();
    }
}

Как мне добавлять дочерние объекты?(Без создания дублирующихся отношений?) ... Также существует ли простой способ обновить эти дочерние элементы при выполнении «ApplyCurrentValues ​​()» для родительского пользователя?

Ответы [ 2 ]

1 голос
/ 25 октября 2011

Этот код работает и не создает дублирующих пользователей.

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();
}
0 голосов
/ 25 октября 2011

Я попробовал более упрощенный подход и понял:

    var newCompany = pocoObject.Companies.Last();
    newCompany.Users = null;
    loadedUser.Companies.Add(newCompany);

Оказывается, потому что там была ссылка на родителя ВНУТРИ дочернего элемента, он распространялся вверх и вызывал создание нового родителя. Таким образом, с точки зрения POCO, мне пришлось удалить родителя и сделать его очень простым объектом. (Или я мог бы просто удалить ссылку «Родитель ребенка» в edmx). Но даже это облегчает мне жизнь:

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