【问题标题】:Many to many in LINQ to SQLLINQ to SQL 中的多对多
【发布时间】:2012-03-15 21:15:24
【问题描述】:

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

在我的表单中,我试图从客户那里检索地址(或多个)。 我尝试了以下代码,但总是遇到同样的错误:序列不包含元素,但它确实有元素! (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_klant --> location_customer

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

感谢您的帮助!

【问题讨论】:

    标签: c# linq-to-sql database-design many-to-many


    【解决方案1】:

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

    为什么会出现这个问题:

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

    尤其是像这样的关系,您应该坚持使用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/forums 上使用问题时更轻松。

    【讨论】:

    • 感谢您的帮助,我的联接表似乎是空的(我之前查看了错误的联接表)。今天我将尝试添加具有多个位置的客户。当我写任何代码时,我通常使用英语,但我不是唯一一个在这个项目上工作的人,他的英语不太好,他们更喜欢荷兰语。谢谢您的帮助! :)
    • 我无法将“Location”实体添加到连接表“locatie_klant”,我不确定我在这里做什么,抱歉!
    • @ThomasSchoof 简单地复制和粘贴错误CustomerLocation1CustomerLocation2 应该是locatie_klant 类型,而不是klant,更新了代码,现在它应该可以工作了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多