实体框架禁用加载虚拟成员

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实体框架禁用加载虚拟成员相关的知识,希望对你有一定的参考价值。

我用SSMS创建了一个数据库。然后我做了整个C#项目并用NuGet安装了EF。我希望EF为我创建所有类和上下文,所以我从数据库中做了Code First,它为我做了。现在Product类就像这样:

    public partial class Product
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Product()
        {
            Orders = new HashSet<Order>();
        }

        public int ID { get; set; }

        [Required]
        [StringLength(50)]
        public string Name { get; set; }

        public int Type_ID { get; set; }

        public decimal Price { get; set; }

        public string Descryption { get; set; }

        public int Available_amount { get; set; }

        public virtual Product_Type Product_Type { get; set; }

        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Order> Orders { get; set; }
    }
}

问题是,Product表看起来像这样:

enter image description here

它与OrdersProduct_Type表有关。现在,当我想要获得所有产品并将它们移动到dataGridView时 - 会发生这种情况:

获取产品的代码:

public void GetProducts()
{
    using (var db = new SklepContext())
    {
        var data = db.Products.ToList();
        dataGridViewBrowse.DataSource = data;
    }
}

效果:

enter image description here

首先它是在我脸上抛出错误,所以我不得不在我的this.Configuration.ProxyCreationEnabled = false;构造函数中添加这行SklepContext

问题是如何才能让它不能读取那些虚拟成员(不知道EF为什么会首先添加它们)或者让EF在没有它们的情况下创建这些类(我不能删除它们只是删除那两行Product类),所以我的dataGridView只显示数据库中的值?

答案

如果你突然说,你的头衔是非常误导的

在将数据绑定到dataGridView时,我只是不想要那两个最后一列

这两列出现在dataGridView中的原因是因为您直接绑定了模型。

以下是一些替代方案:

1.绑定后删除列。

dataGridView1.Columns.RemoveAt(dataGridView1.Columns.Count - 1);
dataGridView1.Columns.RemoveAt(dataGridView1.Columns.Count - 1);

2.为绑定创建不同的视图模型

public class DataGridViewModel
{   
    public int ID { get; set; }

    public string Name { get; set; }

    public int Type_ID { get; set; }

    public decimal Price { get; set; }

    public string Descryption { get; set; }

    public int Available_amount { get; set; }

    public DataGridViewModel()  
    {    
    }
}

public void GetProducts()
{
    using (var db = new SklepContext())
    {
        var data = db.Products.Select(r => new DataGridViewModel()
        {
            ID  = r.ID,
            Name = r.Name,
            Type_ID = r.Type_ID,
            Price = r.Price,
            Descryption = r.Descryption,
            Available_amount = r.Available_amount
        }).ToList();
        dataGridViewBrowse.DataSource = data;
    }
}

以上是关于实体框架禁用加载虚拟成员的主要内容,如果未能解决你的问题,请参考以下文章

当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?

尽管代理被禁用,实体框架会自动设置关系

禁用实体框架的默认值生成(代码优先)

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

使用实体框架更新数据库记录(延迟加载和虚拟属性)

使用 BottomBar 和片段容器禁用 Android 片段重新加载