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

я сделал код первой модели, которая имеет эти POCO:

    public class Customer
    {
    public int CustomerId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int gender { get; set; }
    public virtual List<Order> Orders { get; set; }
    }

    public class Order
    {
    public int OrderId { get; set; }
    public string OrderName { get; set; }
    }

context:

    public class DatabaseContext : DbContext
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Order>().HasKey(x => x.OrderId);
        modelBuilder.Entity<Customer>().HasKey(z => z.CustomerId);
        base.OnModelCreating(modelBuilder);
    }       
    public DbSet<Order> Orders { get; set; }
    public DbSet<Customer> Customers { get; set; }
}

теперь все в порядке:

но когда я запускаю этокод:

        private void button2_Click(object sender, EventArgs e)
    {
        DatabaseContext db = new DatabaseContext();
        if (cs == null)
            cs = db.Customers.FirstOrDefault();
        db.Orders.Remove(db.Orders.FirstOrDefault());
        db.SaveChanges();
        MessageBox.Show(cs.Orders.Count.ToString());
    }

количество cs.Orders.Count всегда остается неизменным.

что я делаю не так?

примечание: все заказы принадлежат одному и тому же клиенту, я просто воспроизвожу более сложную ситуацию.

вопрос другими словами как мне обновить состояние cs со всеми его потомками?

заранее спасибо ..

Ответы [ 2 ]

1 голос
/ 27 июня 2011

Вы имели в виду для этой строки:

db.Orders.Remove(db.Orders.FirstOrDefault());

На самом деле читать так:

db.Orders.Remove(cs.Orders.FirstOrDefault());

Разве вы не хотите удалить заказ у клиента?

0 голосов
/ 27 июня 2011

С этой строкой:

cs = db.Customers.FirstOrDefault();

Вы получаете первого клиента в таблице и назначаете его для cs.

С этой строкой:

db.Orders.Remove(db.Orders.FirstOrDefault());

Вы удаляете первый заказ в таблице заказов, который может быть или не быть заказом, связанным с клиентом cs.

Не хотели бы вы сделать что-то вроде:

db.Orders.Remove(db.Orders.Where(o => o.CustomerId == cs.CustomerId).FirstOrDefault());

очевидно, я просто угадываю названия клавиш

...