我有一个方法可以遍历 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/