为了账号安全,请及时绑定邮箱和手机立即绑定

防止数据网格在 C# 中加载实体框架导航属性

防止数据网格在 C# 中加载实体框架导航属性

C#
梵蒂冈之花 2022-06-18 17:31:48
我有一个数据库(具体来说是 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;    }
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

加载导航属性并显示它们是两个不同的主题。


防止加载


禁用延迟加载并仅包含您需要的那些导航属性


var db = new MyDbContext(); 

db.Configuration.LazyLoadingEnabled = false; 

data = db.MyEntity.Local.ToBindingList();

防止显示


用 装饰导航属性[Browsable(false)]。


[Browsable(false)]

public virtual EQUIPMENT EQUIPMENT { get; set; }

或者


将列可见性设置为 false:


dataGridView1.Columns["EQUIPMENT"].Visible = false

或者


首先,只为DataGridView使用设计器或使用代码定义一组列。然后DataGridView将仅显示您定义的那些列:


var DRIVERIDColumn = new DataGridViewTextBoxColumn();

DRIVERIDColumn.Name = "DRIVERID";

DRIVERIDColumn.HeaderText = "Id";

DRIVERIDColumn.DataPropertyName= "DRIVERID";

// ...

dataGridView1.Columns.AddRange(DRIVERIDColumn /*...*/);

// ...


查看完整回答
反对 回复 2022-06-18
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信