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