实体框架——不能从用法中推断

本文关键字:用法 框架 不能 实体 | 更新日期: 2023-09-27 18:16:04

我一直在尝试学习EF代码第一。首先,它不会强制惟一……所以…我试图通过暴露一个只读IEnumerble属性来解决这个问题,如果我想向集合添加任何东西,就强制我使用AddProp方法…

当我尝试这样做时(这只是下面的一个"Throw Away"示例),我得到了错误。

错误1方法' system . data . entity . modelconfiguration . entitytypconfiguration . hasmany (System.Linq.Expressions.Expression>>)'的类型参数不能从用法中推断出来。尝试显式指定类型参数。C:'Users'User'Documents'Visual Studio 2010'Projects'ConsoleApplication3'ConsoleApplication3'Program.cs 39 9 ConsoleApplication3

为什么?

class Program
{
  static void Main(string[] args)
  {
    using (DC _db = new DC())
    {
      PrimeA p = new PrimeA { Name = "BlahGEEEER" };
      p.AddProp(new Prop { comment = "Blah HI!" });
      p.AddProp(new Prop { comment = "Blah HI!" });

      Console.ReadLine();
      _db.PrimeAs.Add(p);
      _db.SaveChanges();
    }
  }
}
public class DC : DbContext
{
  public DbSet<PrimeA> PrimeAs { get; set; }
  public DbSet<PrimeB> PrimeBs { get; set; }
  public DbSet<Prop> Props { get; set; }
  protected override void OnModelCreating(DbModelBuilder modelBuilder)
  {
    modelBuilder.Entity<PrimeA>()
      .HasMany(p => p.Props)  // <---- FAILS HERE
      .WithMany();
    base.OnModelCreating(modelBuilder);
  }
}
public class PrimeA
{
  private List<Prop> m_Props = new List<Prop>();
  public int PrimeAID { get; set; }
  public string Name { get; set; }
  public virtual IEnumerable<Prop> Props
  {
    get 
    {
      return m_Props;
    }
  }
  public bool AddProp(Prop prop)
  {
    bool ret = false;
    var existingResult =
      from p in m_Props
      where p.comment.ToLower() == prop.comment.ToLower()
      select p;
    if (existingResult.Count() == 0)
    {
      m_Props.Add(prop);
      ret = true;
    }
    return ret;
  }
}

实体框架——不能从用法中推断

正如您在MSDN中看到的,EntityTypeConfiguration.HasMany期望ICollection<TTargetEntity>。所以你必须改变

中的Props
public virtual ICollection<Prop> Props

尝试使用ICollection代替IEnumerable作为你的Props属性。这应该会使错误消失。

这里有几篇文章有助于解释为什么你想使用IList或ICollection而不是IEnumerable。

ICollection Vs List in Entity Framework

为什么实体框架需要一个iccollection来延迟加载?

我还建议使用HashSet作为道具的私有属性,而不是List

泛型函数有类型参数,它们尝试"猜测"/"推断"类型参数,但有时会混淆,您必须显式指定它们。我不知道为什么在这种情况下它不能推断,但在你的情况下,我会尝试这样做,因为在这种情况下,我认为它想知道目标集合的类型。

.HasMany<Prop>(p => p.Props)