实体框架生成的意外属性

时间:2014-07-08 08:53:15

标签: c# winforms

我正在使用Entity框架开发一个winform应用程序。这是我的.edmx类图

enter image description here

当我从此查询中获取数据时,

var empQuery = from emp in db.Publishers 
                       select emp;
List<Publisher> pubList = empQuery.ToList();
dataGridView1.DataSource = pubList;

名为BOOKs的列也在返回。我想阻止它。请求给我一个建议。我是Entity Framework的新手。

4 个答案:

答案 0 :(得分:4)

根据您的表关系自动生成导航属性。如果您不想要该属性,只需将其从EDMX中删除即可。

但是,请记住导航属性通常是延迟加载的,这意味着即使存在此属性,在访问之前它实际上也不会包含任何数据。

答案 1 :(得分:3)

假设您不想在数据网格视图中显示BOOKs列,则需要手动指定其中的列或返回其他类型。你可以使用这样的匿名类型:

var empQuery = (from emp in db.Publishers 
                select new
                {
                    emp.Id, emp.Name, emp.Year
                }).ToList();
dataGridView1.DataSource = empQuery;

答案 2 :(得分:0)

&#34;列BOOKS&#34;不是列,它是导航属性。在这种情况下,它是Book实体的集合,与当前Publisher实体相关。 我认为您在数据网格中获得了此列BOOKS,因为您没有在datagridView1中指定要显示的列。 请记住,如果在数据网格(http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.datagrid.autogeneratecolumns%28v=vs.110%29.aspx)中使用AutogenerateColumns标志,则数据网格将为数据源集合中实体的每个属性呈现一列。 更具体地说,我需要知道你工作的场景(ASP.NET,Silverlight等)

答案 3 :(得分:-1)

Books属性不代表数据库列,它表示Publisher和Book的关系,并包含Books表中的相关书籍(这些书籍经常被延迟加载)。

这是EF(和其他ORM)的工作方式。您可以编辑模型并删除两者之间的关系,但如果您这样做,则不会使用EF的一个关键功能。

我的建议是保留您的域模型(因为它是正确的)并更新Gridview的列,以便不显示该属性。