实体框架禁用加载虚拟成员
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
表看起来像这样:
它与Orders
和Product_Type
表有关。现在,当我想要获得所有产品并将它们移动到dataGridView
时 - 会发生这种情况:
获取产品的代码:
public void GetProducts()
{
using (var db = new SklepContext())
{
var data = db.Products.ToList();
dataGridViewBrowse.DataSource = data;
}
}
效果:
首先它是在我脸上抛出错误,所以我不得不在我的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;
}
}
以上是关于实体框架禁用加载虚拟成员的主要内容,如果未能解决你的问题,请参考以下文章
当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?