1

使用实体框架,如果我有以下模型:

class Asset {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<AssetGroup> Groups { get; set; }
}

class AssetGroup {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Asset> Assets { get; set; }
}

将现有资产添加到给定组而无需查询数据库以加载相关资产相对简单:

using(var context = new MyContext()) {
    AssetGroup assetGroup = context.AssetGroups.Find(groupId);

    // Create a fake Asset to avoid a db query
    Asset temp = context.Assets.Create();
    temp.Id = assetId;
    context.Assets.Attach(temp);

    assetGroup.Assets.Add(temp);
    context.SaveChanges();
}

但是,我现在有一个问题,我扩展了模型,以便有多种资产类型,实现为继承层次结构。在此过程中,资产类已被抽象化,因为没有特定类型的资产是没有意义的:

abstract class Asset {
    public int Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<AssetGroup> Groups { get; set; }
}

class SpecificAsset1 : Asset {
    public string OneProperty { get; set; }
}

class SpecificAsset2 : Asset {
    public string OtherProperty { get; set; }
}

问题是现在Create()调用抛出一个InvalidOperationException因为“无法创建抽象类的实例”,这当然是有道理的。

所以,问题是,我怎样才能更新多对多关系而不必从数据库中获取资产?

4

1 回答 1

2

您可以使用通用Create<T>方法DbSet<T>来创建派生实体对象。

var temp1 = context.Assets.Create<SpecificAsset1>();

并从这里继续使用您已经做的方式temp1作为存根实体。

于 2013-06-03T18:18:11.753 回答