实体框架:与抽象类的多对多关系,在不查询数据库的情况下进行修改?

时间:2013-06-03 16:21:49

标签: c# entity-framework

使用Entity Framework,如果我有以下模型:

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();
}

但是,我现在遇到的问题是我扩展了模型,因此存在多个Asset类型,实现为继承层次结构。在这个过程中,Asset类已经变得抽象,因为没有特定类型的资产是没有意义的:

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因为“无法创建抽象类的实例”,这当然是有道理的。

所以,问题是,如何在不必从数据库中获取资产的情况下更新多对多关系?

1 个答案:

答案 0 :(得分:2)

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

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

并使用temp1作为存根实体继续从此处开始。