我正在使用Entity Framework 6
与Generic Repository
和DTOs
。
我想通过导航属性创建新的entities
。
这是我的模特:
public partial class Project
{
public Project()
{
this.ProjectAssets = new List<ProjectAsset>();
}
public int ProjectID { get; set; }
public string Name { get; set; }
public virtual ICollection<ProjectAsset> ProjectAssets { get; set; }
}
public partial class Asset
{
public Asset()
{
this.Revisions = new List<Revision>();
}
public int AssetID { get; set; }
public string Name { get; set; }
public short Type { get; set; }
public virtual ICollection<Revision> Revisions { get; set; }
}
public partial class ProjectAsset
{
public int MappingID { get; set; }
public int ProjectID { get; set; }
public int AssetID { get; set; }
public virtual Asset Asset { get; set; }
}
我已经创建了Project
。如果我正在创建新的Asset
,那么从刚创建的Project Asset
创建AssetID
Asset
,就可以了,但我必须从中重新获取Project
D B。
我想在一次交易中这样做:
Project.ProjectAssets.Add(new ProjectAsset(new Asset((short)type, fileName)));
ServiceLocator.Default.ResolveType<IPipeLine>().Update(Project);
public void Update<TEntity>(TEntity entity) where TEntity : class
{
var fqen = GetEntityName<TEntity>();
object originalItem;
var key = ((IObjectContextAdapter)DbContext).ObjectContext.CreateEntityKey(fqen, entity);
if (((IObjectContextAdapter)DbContext).ObjectContext.TryGetObjectByKey(key, out originalItem))
((IObjectContextAdapter)DbContext).ObjectContext.ApplyCurrentValues(key.EntitySetName, entity);
//DbContext.Entry(entity).State = EntityState.Modified;
}
但在SaveChanges
之后,DB中没有记录,MappingID
仍为0。
我认为ApplyCurrentValues
必须与Navigation Properties
一起使用。
有没有什么好方法可以解决这个问题?
修改
我通过DAL
访问包含相同属性的Business Entities
,但他们还实现了INotifyPropertyChanged
和其他WPF
内容。所以我想我可以订阅CollectionChanged
事件并手动创建/删除导航属性中的实体。在财产制定者中,我可以调用更新,但我认为它可以大大降低性能。