Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C中实体框架4.1(正确方法)中的查找表#_C#_Entity Framework_Lookup - Fatal编程技术网

C# C中实体框架4.1(正确方法)中的查找表#

C# C中实体框架4.1(正确方法)中的查找表#,c#,entity-framework,lookup,C#,Entity Framework,Lookup,随着Entity Framework 4.1的新发布,我认为现在是学习如何在编码中使用它的好时机。我开局不错,但我似乎遇到了困难,我不知道最好的方法是什么 我的问题是,在使用查找表时,当从查找表中提取数据时,我看不到如何将数据保留为对象(而不是列表、匿名类型等) 我已经在谷歌上搜索过了,但我找到的大多数帖子都是在EF4.1的最新版本之前发布的,我认为有更好的方法可以做到这一点 我有一个简单的“发票头”和“客户”情况,因此我按照您的预期设置了映射(发票头具有与其相关的客户Id) 如果我只从invo

随着Entity Framework 4.1的新发布,我认为现在是学习如何在编码中使用它的好时机。我开局不错,但我似乎遇到了困难,我不知道最好的方法是什么

我的问题是,在使用查找表时,当从查找表中提取数据时,我看不到如何将数据保留为对象(而不是列表、匿名类型等)

我已经在谷歌上搜索过了,但我找到的大多数帖子都是在EF4.1的最新版本之前发布的,我认为有更好的方法可以做到这一点

我有一个简单的“发票头”和“客户”情况,因此我按照您的预期设置了映射(发票头具有与其相关的客户Id)

如果我只从invoice表中拉入数据,那么我会得到一个真正的对象,我可以绑定到datagrid,然后保存更改,但这不会像这样拉入客户名称,例如:

        var results = from c in context.InvoiceHeaders
                      select c;
如果我重新构造查询以拉回特定列,包括向下钻取客户表并直接获取客户名称,那么我将获得所需的数据,但它现在不是我期望的对象类型(发票对象),如下所示:

        var results = from c in context.InvoiceHeaders
                      select new { c.CreatedBy, c.Customer.Name };
但是现在它变成了一个匿名类型,并且它似乎失去了与数据库的绑定(希望我说得通)

所以-我的问题是,“在EF4.1中使用查找表的最佳/官方方式是什么”和/或“我可以使用查找表并保留绑定吗”

请让我知道,如果你需要我发布任何代码,但在这个场合,因为这是一个一般性的问题,我觉得我不需要

提前感谢,


James

我认为答案是确保在结构中使用
引用对象(我认为这就是EF所称的对象)。因此,发票不仅具有
public int ClientId{get;set;}
,而且还具有
public虚拟客户机{get;set;}
,这为您提供了到实际客户机的直接链接,并且仍然应该返回
Invoice
对象。

哦,我现在明白了问题所在。创建匿名类型时,它基本上是一个新类(它有一个类型定义和所有内容)。因为它是一种新类型,您可以控制它,所以它不是EF数据类型或链接到数据上下文


您最好返回整个customer对象。我明白当你有大的对象时,这会导致性能问题,我只能说,保持你的对象小一些

EF类是局部类,因此您可以扩展它们:

public partial class InvoiceHeaders
{
    public string CustomerName
    {
        get
        {
            try
            {
                return this.Customer.Name;
            }
            catch
            {
                return string.Empty;
            }
        }
        private set { }
    }
}
但在设计表单时,数据绑定工具确实注意到正确使用了此扩展,因此在将组件绑定到数据源时,您应该定义一个新类并将该类用作数据源:

public partial class InvoiceHeadersEx : InvoiceHeaders
{
}
并在form.load事件中更改绑定数据源:

private void Form1_Load(object sender, EventArgs e)
{
    InvoiceHeadersExDataGridView.DataSource = InvoiceHeadersSource;
    InvoiceHeadersBindingSource.DataSource = context.InvoiceHeaders;
}

你好,Jaimal,请参阅我的更新帖子,了解代码示例。你明白我现在在说什么吗?第一个示例保留绑定,但不显示客户名称,第二个示例是visa Versas,谢谢您的评论。我是EF的新手-我在哪里可以找到你告诉我的代码?它在model.designer.cs中吗?看看最新的ASP.NET MVC 3教程-它们首先讨论了EF代码,并展示了引用对象的用法。