IDbSetExtensions.AddOrUpdate está destinado a ayudar a escribir código que funciona igual si la base de datos está vacía o llena. Pero vincular objetos necesita un código diferente. Cuando la base de datos está vacía, los objetos aún no tienen ID y los vincula mediante la asignación de la propiedad de navegación. Sin embargo, cuando los objetos ya existen, las propiedades de navegación no funcionan y debe establecer las claves foráneas directamente. Las propiedades de navegación funcionan para proxies en ambos casos, a costa de perder POCO. Editar: En realidad, los proxies no funcionan cuando ambas entidades son antiguas.IDbSetExtensions.AddOrUpdate y relaciones
accidentes de esta muestra en el segundo SaveChanges llaman, cuando se trata de establecer EF CountryId a 0:
public class Country
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
}
public class Person
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual int CountryID { get; set; }
public virtual Country Country { get; set; }
}
public class Context : DbContext
{
public DbSet<Person> Person { get; set; }
public DbSet<Country> Country { get; set; }
}
class Program
{
static void Foo()
{
using (var db = new Context())
{
//var c = new Country();
var c = db.Country.Create();
c.Name = "usa";
db.Country.AddOrUpdate(x => x.Name, c);
//var p = new Person();
var p = db.Person.Create();
p.Name = "billg";
p.Country = c;
db.Person.AddOrUpdate(x => x.Name, p);
db.SaveChanges();
}
}
static void Main()
{
Database.SetInitializer<Context>(new DropCreateDatabaseAlways<Context>());
Foo();
Foo();
}
}
¿Cómo se usa AddOrUpdate?
le recomiendo que lo leas http://thedatafarm.com/blog/data-access/take-care-with-ef-4- 3-addorupdate-method/ –