1。问题#1
我有POCO
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public ICollection<Version> Versions { get; set; }
}
在我的DbContext中,我有func
public void AttachUpdated<T>( T objectDetached) where T : class
{
var objContext = ((IObjectContextAdapter)this).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, objectDetached);
object original;
if (objContext.TryGetObjectByKey(entityKey, out original))
objContext.ApplyCurrentValues(entityKey.EntitySetName, objectDetached);
else
objContext.AddObject(entityKey.EntitySetName, objectDetached);}
所以我想在上下文中添加一些产品
var p1 = new Product(){Id =“1”,Name =“Product 1”;} var p2 = new Product(){Id =“1”,Name =“Product 1”;}
ctx.AttachUpdated(P1);
当我尝试添加相同的产品(与第一个产品具有相同的ID)时,TryGetObjectByKey()找不到已添加的产品。
ctx.AttachUpdated(P2);
因此我需要使用ctx.SaveChanges()或AccseptAllChanges()然后 ctx.AttachUpdated(p2)按预期工作。 我无法理解代码中的问题所在。
Q#2
var p1 = new Product(){Id =“1”,Name =“Product 1”};
var v1 = new Version() { Number = "1.0", Type = "Release", ReleaseDate = "01/01/13" };
p1.Versions = new List<Version>();
p1.Versions.Add(v1);
ctx.AttachUpdated(p1);
然后我看到v1是DbSet()的addet。但为什么?我怎么能防止这样的行为。我只需要添加产品而不是相关版本。
答案 0 :(得分:0)
public void AttachOrUpdate<T>(T entity) where T : class
{
var objContext = ((IObjectContextAdapter)context).ObjectContext;
var objSet = objContext.CreateObjectSet<T>();
var entityKey = objContext.CreateEntityKey(objSet.EntitySet.Name, entity);
var original = this.context.Set<T>().Find(entityKey.EntityKeyValues[0].Value);
if (original != null)
{
this.context.Entry<T>(original).CurrentValues.SetValues(entity);
}
else
objContext.AddObject(entityKey.EntitySetName, entity);
}