【发布时间】:2014-12-04 04:44:26
【问题描述】:
我有两个实体
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 及其类别 ID 的集合(类别数量恒定,每个企业注册一些,例如“私人教师 - 高中”“私人教师 - 小学”等)。
我希望能够创建业务并关联它们,而无需先加载相关类别实体。
我知道可以在一对一的导航属性中使用 foreignKey 属性:
//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 并没有对开发进行太多简化。
【问题讨论】:
-
我对@987654325@ 和
Category之间的关系有点困惑。那应该是多对多还是一对多?因为从您给出的示例来看,您将其视为一对多。 -
实际上两者都可以,两种情况的性能都很糟糕(今天检查过)我的连接或设置可能有问题吗?因为我不敢相信这就是 EF 的反应。其他机器上也一样吗?
标签: c# entity-framework entity-framework-6