gpt4 book ai didi

c# - 复制 Entity Framework 对象

转载 作者:可可西里 更新时间:2023-11-01 08:00:50 26 4
gpt4 key购买 nike

我有一个 EF4.1 类 X,我想复制它及其所有子记录。X.Y 和 X.Y.Z

现在,如果我执行以下操作,它会返回错误。

属性'X.ID'是对象关键信息的一部分,不能修改。

public void CopyX(long ID)
{
var c = db.Xs.Include("Y").Include("W").Include("Y.Z").SingleOrDefault(x => x.ID == ID);
if (c != null)
{
c.ID = 0;
c.Title = "Copy Of " + c.Title;
for (var m = 0; m < c.Ys.Count; m++)
{
c.Ys[m].ID = 0;
c.Ys[m].XID=0-m;
for (var p = 0; p < c.Ys[m].Zs.Count; p++)
{
c.Ys[m].Zs[p].XID = 0 - m;
c.Ys[m].Zs[p].ID = 0 - p;
}
}
for (var i = 0; i < c.Ws.Count; i++)
{
c.Ws[i].ID = 0 - i;
c.Ws[i].XID = 0;
}
db.Entry<Content>(c).State = System.Data.EntityState.Added;
db.SaveChanges();
}
}

或者是否有其他方式制作实体对象的副本。

注意:每个 W、X、Y、Z 都有多个属性。

最佳答案

,这对于 DbExtensions.AsNotracking() 来说非常容易.

Returns a new query where the entities returned will not be cached in the DbContext or 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();

关于c# - 复制 Entity Framework 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7172725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com