实体框架——不能从用法中推断
本文关键字:用法 框架 不能 实体 | 更新日期: 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)