2014-12-03 52 views
0

我有两个实体填充用的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都不是简单的开发工具。

+0

我对“商业”和“类别”之间的关系有点困惑。这应该是多对多的,还是一对多的?因为从你给它的例子看来,它是一对一的。 – IronMan84 2014-12-03 19:38:22

+0

其实它可以是,性能对两种情况都很糟糕(今天检查)是否有可能是我的连接或设置有问题?因为我不相信这是EF如何反应。在其他机器上它是一样的吗? – MatanCo 2014-12-04 20:24:27

回答

1

我相信你在找什么是存根实体。从本质上讲,只需填写主键即可在本地创建一个对象,并使用该对象代替从数据库中提取整个事物。尽管有点旧,但看到这个blog entry。另外这个类似的SO answer

从本质上讲,你将有一个像下面的代码(但是这是一个较旧的EF version..see下文)

Category stub = new Category() {CategoryId = 3}; 
ctx.AttachTo("Categories", stub); 

biz.Categories.Add(stub); 

的AttachTo是把实体的背景下,作为不变的,没有添加。

但在这种情况下,ctx是一个ObjectContext。由于您使用的EF6您很可能希望使用DbSet.Attach的方法,所以你可能有更多的东西一样

context.Categories.Attach(stub); 

老实说,虽然我不认为我这样做在EF6,所以我这不是正面的,这是正确的......但仍然是这个概念是一个存根实体,所以这就是你想要做的搜索。祝你好运!

+0

听起来不错!我会在明天答复之前对它进行测试。我搜索了几个小时的网络,并没有听说过这种巧妙的技术。 – MatanCo 2014-12-04 20:31:50