2012-03-14 76 views
0

在我的数据库中,我有一个客户,他可以有多个位置,一个位置可以有多个客户。我把我的数据库设计拖到Linq To SQL数据类文件中,这就是它目前的样子。LINQ to SQL中的多对多

database

在我的形式,我正在尝试从一个客户ADRESS(或多个)。 我已经尝试了下面的代码,但我总是得到相同的错误:序列不包含任何元素,而它确实有元素! (客户ID为2,位置ID为1,并用2,1联接表)

public static locatie getLocationByCustomer(int id) 
    { 
     var query = (from v in dc.locaties 
         from e in v.locatie_klants 
         where e.klant_id == id 
         select v); 


     locatie locatie = query.First(); 
     return locatie; 
    } 

文:klant - >客户|| locatie - > Location || locatie_klant - > location_customer

我不知道我在做什么错在这里。 我也想知道如何将新客户保存到数据库(有多个位置),有什么想法?

感谢您的帮助!

回答

1

显然,客户的查询与任何地点都无关。因此你的查询不会返回任何元素。这本身不是问题,但在您的示例中,您使用的是First()而不是FirstOrDefault()

这是为什么一个问题:如果没有地址给客户端ID

  • First()会抛出异常。
  • FirstOrDefault()将返回null如果没有给定客户端ID的地址。

特别是像这样的关系,您应该坚持FirstOrDefault(),因为您永远无法确定您正在查询的项目存在关系。

这里是如何添加一个样品Customer + CustomerLocations

var newCustomer = new klant() 
{ 
    // set neccessary properties 
}; 

var newCustomerLocation1 = new locatie_klant() 
{ 
    // set neccessary properties 
}; 

var newCustomerLocation2 = new locatie_klant() 
{ 
    // set neccessary properties 
}; 

using (var context = new DBContext()) 
{ 
    context.klants.Add(newCustomer); 
    context.locatie_klants.Add(newCustomerLocation1); 
    context.locatie_klants.Add(newCustomerLocation2); 
    context.SaveChanges(): 
} 

一些普遍性的建议:
坚持为发展对象的英文名。这被认为是最好的做法也使得你的生活在so /论坛上使用问题变得更容易。

+0

感谢您的帮助,我的连接表似乎是空的(我查看了错误的连接表之前)。我会尝试在今天添加一个拥有多个位置的客户。 当我编写任何代码时,我通常使用英语,但我不是唯一一个在这个项目上工作的人,他的英语不太好,他们更喜欢荷兰语。谢谢您的帮助! :) – Schoof 2012-03-15 09:12:06

+0

我不能添加一个“位置”实体到连接表“locatie_klant”,我不知道我在这里做什么,对不起! – Schoof 2012-03-15 12:59:33

+0

@ThomasSchoof错误“CustomerLocation1'和'CustomerLocation2'应该是'locatie_klant',而不是'klant',更新了代码,现在它应该可以工作 – ntziolis 2012-03-15 13:17:05