2012-08-06 2 views
2

У меня есть некоторые объекты POCO, которые выглядят примерно так:Как использовать/перенести объектные отношения POCO в EF?

public class Foo 
{ 
    public int Id { get; set; } 
    public string FooProperty { get; set; } 
    public int BarId { get; set; } 
    public virtual Bar Bar { get; set; } 
} 
public class Bar 
{ 
    public int Id { get; set; } 
    public string BarProperty { get; set; } 
    public int FooId { get; set; } 
    public virtual Foo Foo { get; set; } 
} 

Каждый объект Foo имеет ровно один бар (и наоборот).

Теперь я хочу создать новую пару объектов Foo/Bar. Так что я делаю это (и это, где я подозреваю, что я буду не права):

var foo = new Foo() { FooProperty = "hello" }; 

dbContext.Foos.Add(foo); 

var bar = new Bar() { BarProperty = "world" }; 

foo.Bar = bar; 

dbContext.SaveChanges(); 

Как вы можете сказать, я надеюсь, что, потому что я «добавил» foo, затем bar также будет добавлен, потому что это часть одного и того же графа объектов, но нет: он не добавлен - и ни один из FooId объекта Bar не обновлен после вызова SaveChanges (хотя объекта Foo обновлен).

Итак, я предполагаю, что это поведение связано с тем, что я имею дело с объектами POCOs, а не с EF-прокси, и поэтому для этой работы нет «сантехники». Я мог бы получить Id от объекта Foo и вручную занести его в объект Bar (и наоборот) и сделать еще несколько звонков на SaveChanges, но, очевидно, это не тот путь.

Итак, по-видимому, мне нужно создать объекты-прокси EF, а не голые объекты POCO. Каков наилучший способ сделать это?

+0

Там нет «ошибки», но таблицы БД не обновляются как я и хотел, а также объекты POCO обновлены. –

+0

Вы выполнили настройку в объекте DbContext, чтобы связать свойства BarId и Virtual Bar вместе? Я подозреваю, что в вашей базе данных есть дополнительные поля, такие как 'Foo_Id', а также ваш' FooId', если у вас нет – Richard

+0

Да, я немного использовал HasRequired/WithRequired. –

ответ

3

Если юридические лица отвечают требования для создания прокси-объектов, вы можете сделать эту работу с помощью вызова функции создания из самого контекста:

var foo = dbContext.Foos.Create(); 
    dbContext.Foos.Add(foo); 
    var bar = dbContext.Bars.Create(); 
    foo.Bar = bar; 
    dbContext.SaveChanges(); 
+0

Спасибо. Я решил, что это должно быть что-то в этом роде. –

Смежные вопросы