В entity-framework-5 это невероятно легко с DbExtensions.AsNotracking () .
Возвращает новый запрос, в котором возвращенные сущности не будут кэшироваться в DbContext или ObjectContext.
Это, похоже, относится ко всем объектам в графе объектов.
Вы просто должны действительно понимать свой график и то, что вы делаете, и не хотите вставлять / дублировать в БД.
Предположим, у нас есть такие объекты, как:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
public class Address
{
public int ID { get; set; }
public AddressLine { get; set; }
public int StateID { get; set; }
public ICollection<State> { get; set; }
}
Итак, чтобы дублировать человека, мне нужно продублировать адреса, но я не хочу дублировать Штаты.
var person = this._context.Persons
.Include(i => i.Addresses)
.AsNoTracking()
.First();
// if this is a Guid, just do Guid.NewGuid();
// setting IDs to zero(0) assume the database is using an Identity Column
person.ID = 0;
foreach (var address in person.Addresses)
{
address.ID = 0;
}
this._context.Persons.Add(person);
this._context.SaveChanges();
Если вы затем захотите затем снова использовать те же самые объекты, чтобы вставитьтретий дубликат, вы либо снова запустите запрос (с помощью AsNoTracking ()), либо отсоедините объекты (пример):
dbContext.Entry(person).State = EntityState.Detached;
person.ID = 0;
foreach (var address in person.Addresses)
{
dbContext.Entry(address).State = EntityState.Detached;
address.ID = 0;
}
this._context.Persons.Add(person);
this._context.SaveChanges();