EF6,DTO,更新导航属性

时间:2013-10-14 17:28:31

标签: entity-framework crud dto n-tier-architecture

我正在使用Entity Framework 6Generic RepositoryDTOs。 我想通过导航属性创建新的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事件并手动创建/删除导航属性中的实体。在财产制定者中,我可以调用更新,但我认为它可以大大降低性能。

0 个答案:

没有答案