我有两个实体填充用的ID导航集合,而不到相关实体
public class Business
{
public int BusinessId { get; set; }
public ICollection<Category> Categories = {get;set;}
}
而且
public class Category
{
[Key]
public int CategoryId { get; set; }
public string Name { get; set; }
}
我从我的客户包含一个JSON其类别中的一个业务ID,并收集得到的参考身份证(有不同数量的类别,每个企业注册一些,例如“私人教师 - 高中”,“私人教师 - 初级”等)。
我希望能够创建业务并关联它们,而无需首先加载相关类别实体。
我知道这是可能在一对单的导航属性使用外键属性:
//EXAMPLE OF 1-1
public class Business
{
[ForeignKey]
public int CatId{ get; set; }
public Category cat {get;set;}
}
但无法找到集合导航性能的解决方案。
性能方面,这是一场灾难, 在我写的一个测试中创建了100个拥有1000个类别中的3个类别的企业接管了5秒!
DateTime start = DateTime.Now;
for (int i = 0; i < 100; i++)
{
using (Model m = new Model())
{
Business biz = new Business();
biz.Categories.Add(m.Categories.Find(3));
biz.Categories.Add(m.Categories.Find(5));
biz.Categories.Add(m.Categories.Find(63));
}
}
DateTime end = DateTime.Now;
Console.WriteLine(end - start);
(使用相同的DbContext是错误的,只能让我到3秒)。
我知道我可以使用一种变通方法,并存储所有我的静态词典分类,并从那里获取,但 A.我不知道EF不会为他们创建新实例每次 B.即使我克服A,我仍然需要一个EF解决方案来解决这个问题,这让我想也许我不应该使用EF,并坚持旧的T-SQL和存储过程。 也许EF无法通过任何方式与专门设计的T-SQL竞争(不是60%,而是600%)。与T-SQL相比,所有Lambadas,谓词和LINQ都不是简单的开发工具。
我对“商业”和“类别”之间的关系有点困惑。这应该是多对多的,还是一对多的?因为从你给它的例子看来,它是一对一的。 – IronMan84 2014-12-03 19:38:22
其实它可以是,性能对两种情况都很糟糕(今天检查)是否有可能是我的连接或设置有问题?因为我不相信这是EF如何反应。在其他机器上它是一样的吗? – MatanCo 2014-12-04 20:24:27