1

我制作了一个简单的数据库,其中包含 2 个表和几列。在我安装实体框架 4.1+ 时阅读的一些教程中,我可以生成“DbContext 代码”,然后我可以使用本地上下文来获取比 DbSet 更好的 ObservableCollection,因为它会自动更新 UI。所以我安装了实体框架 4.1,选择了我的数据库模型并选择了“ADO.NET DbContext Generator”。所以我得到了这个:

namespace BazaStudentow
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;

    public partial class DatabaseEntities : DbContext
    {
        public DatabaseEntities()
            : base("name=DatabaseEntities")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            throw new UnintentionalCodeFirstException();
        }

        public DbSet<Notes> Notes { get; set; }
        public DbSet<Students> Students { get; set; }
    }
}

加上带有简单表模型的 StudModel.tt 文件。

所以在主课中我添加了这个: DatabaseEntities db = new DatabaseEntities();

但后来我意识到 db.Students.Local 是空的(我之前在编辑器中手动添加了 2 条记录),虽然 db.Students 有 2 条记录。所以我发现了这个:ObservableCollection 比 ObjectSet 更好(第二个答案),但是没有“Load”这样的方法。我错过了什么?我应该添加一些特殊代码来让这个“加载”工作吗?

我只是简单地想: 1。创建新项目并添加简单的数据库。2.使用Entity Framework自动生成一些代码,这样我就可以将表绑定到DataGrid或其他东西,当数据更改时会自动更新(所以我需要ObservableCollection)。3. 当我有这个添加一些功能到插入/更新/删除数据(使用自动更新 ofc)。

请帮忙,干杯;)

4

1 回答 1

1

在您对数据库执行查询之前,Local 中不会有任何内容。实现此目的的一种方法是调用 Load,它会这样做,并返回 ObservableCollection(Of Student)(在您的情况下)。

Dim bs = New BindingSource
Dim s = db.Students

s.Load()

'At this point, Local will contain all students.
'Cast to a BindingList, which stays in sync with the ObservableCollection.

bs.DataSource = s.Local.ToBindingList

或者我想你可以走这条路:

Dim bs = New BindingSource
db.Students.Load
bs.DataSource = db.Students.Local.ToBindingList

抱歉,C# 不是我的朋友。上面的代码应该很容易转换。

您在上面生成模型和上下文的步骤看起来不错。

于 2012-09-03T20:56:21.030 回答