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

时间:2017-12-20 00:40:27

标签: c# entity-framework datagridview

我用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类中有2行,所以我的dataGridView只显示数据库中的值?

1 个答案:

答案 0 :(得分:1)

如果你突然说出来,你的头衔会非常误导

  

在将数据绑定到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;
    }
}