我有一个方法可以遍历 guid 列表并通过 DbContext 将它们保存到数据库中。 B 是 WebObjects 的 DbSet 集合(例如: DbSet<MlaPerson> MlaPersons )

protected void AddRelatedWebObject<A, B>(A mlaObject, B inputObject, List<Guid> guids)
    where A : WebObject
    where B : DbSet<WebObject>
{
    foreach (Guid guid in guids)
    {
        mlaObject.RelatedWebObjects.Add(inputObject.Find(guid));
        _db.SaveChanges();
    }
}

用法 :
foreach (ArticleRelationships item in articleRelationships)
{
    MlaArticle article = new MlaArticle();
    article = _db.MlaArticles.Include(m => m.WebSite).Where(m => m.Id == item.ArticleId).First();
    AddRelatedWebObject<MlaArticle, DbSet<MlaPerson>>(article, _db.MlaPersons, item.PersonIds);
}

_db.MlaPersons 被定义为 :
public class ECM2Context : DbContext
{
    public DbSet<MlaPerson> MlaPersons { get; set; }
}

和 MlaPerson 被定义为 :
public class MlaPerson : WebObject, IValidatableObject
{
    ...
}

我认为通过推断 B 是 DbSet<WebObject> 会起作用,因为 MlaPerson 的基类是 WebObject,但我错了。我收到错误:
The type 'System.Data.Entity.DbSet<ExternalContentManager.Models.MlaPerson>' cannot be used as a type parameter 'B' in the generic type or method 'AddRelatedWebObjects'. There is not implicit reference conversion from 'System.Data.Entity.DbSet<ExternalContentManager.Models.MlaPerson>' to 'System.Data.Entity.DbSet<ExternalContentManager.Models.WebObject>'
我真的很感激所提供的任何帮助。谢谢你的帮助。

最佳答案

您正在犯一个常见的泛型错误 - 假设集合是协变的。也就是说,即使汽车继承自车辆,List<Car> 的实例也不会继承自 List<Vehicle>。同样,即使 MlaPerson 继承自 WebObject,DbSet<MlaPerson> 也不继承自 DbSet<WebObject>

你需要做的是这样的事情(我还没有测试过这段代码):

protected void AddRelatedWebObject<A, B, O>(A mlaObject, B inputObject, List<Guid> guids)
    where A : WebObject
    where B : DbSet<O>
    where O : WebObject
{
    foreach (Guid guid in guids)
    {
        mlaObject.RelatedWebObjects.Add(inputObject.Find(guid));
        _db.SaveChanges();
    }
}

并使用它:
foreach (ArticleRelationships item in articleRelationships)
{
    MlaArticle article = new MlaArticle();
    article = _db.MlaArticles.Include(m => m.WebSite).Where(m => m.Id == item.ArticleId).First();
    AddRelatedWebObject<MlaArticle, DbSet<MlaPerson>, MlaPerson>(article, _db.MlaPersons, item.PersonIds);
}

如果你这样做,你可能可以放弃类型规范( <MlaArticle, DbSet<MlaPerson>, MlaPerson> ),因为它应该推断它。

关于c# 类型推断 - 错误 - 没有来自的隐式引用转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7653071/

10-10 04:00