【发布时间】:2018-12-19 18:27:16
【问题描述】:
我有一个数据库(具体来说是 Firebird,但我认为问题与 EF 有关)。我已经使用数据库中的 Code First 生成了代码文件。例如为驱动程序生成的代码是:
[Table("Firebird.DRIVER")]
public partial class DRIVER
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public DRIVER()
{
FAREs = new HashSet<FARE>();
//..... and other code generated for the other collections
}
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int DRIVERID { get; set; }
[StringLength(100)]
public string FULLNAME { get; set; }
//... and other properties
public int? EQUIPMENTID { get; set; }
public virtual EQUIPMENT EQUIPMENT { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<FARE> FAREs { get; set; }
//.... and other code generated for the other collections
}
我有一个带有 DataGridView 的基本表单。 DataGridView 的目的是编辑、添加或删除新实体(驱动程序)。我是这样绑定的
private async Task BindGrid()
{
var DBContext = AppVariables.CreateContext();
await Task.Run(() => DBContext.DRIVERs.Load());
var bindingSource = DBContext.DRIVERs.Local.ToBindingList();
dataGridView1.DataSource = bindingSource;
}
但是,我在网格中获取了导航属性(例如设备)。我该怎么做才能从加载网格中删除导航属性。我应该先从代码中删除导航属性吗?还是有其他方法可以在不加载导航属性的情况下将数据加载到网格中?
我尝试仅使用属性创建对象并避免使用导航,但网格不可编辑
private async Task BindGrid()
{
var list = from driver in DBContext.DRIVERs
select new
{
DRIVERID = destination.DRIVERID
//...
};
await list.LoadAsync();
var bindingSource = list.ToBindingList();
dataGridView1.DataSource = bindingSource;
}
【问题讨论】:
-
阻止加载与阻止显示不同。如果是关于列的可见性,您可以将列的
Visible属性设置为 false 或完全删除它。您还可以为班级中的属性设置Browsable(false)。如果是关于加载,首先禁用延迟加载,然后确保查询中没有包含该列。 -
关于您共享的第一个
BindGrid方法的旁注:为了能够保存更改,您需要使用与加载相同的 dbcontext 实例。看看this post。 -
@RezaAghaei 感谢您的评论。这不仅仅是关于列的可见性,因为我在每个类中有很多导航属性,我不想加载它们。对于查询,我尝试使用查询,但网格不可编辑。抱歉,我刚开始 EF。
-
只需禁用
LazyLoading,然后确保您没有Include任何导航属性,除非有必要。这样就够了。 -
通过查询我不是指匿名对象。只需禁用
LazyLoading,然后确保您没有Include任何导航属性,除非有必要。那就足够了。那么当你得到var data = DBContext.DRIVERs.Local.ToBindingList();那么这个列表就不会包含导航属性的任何数据了。
标签: c# winforms entity-framework entity-framework-6