【问题标题】:Select a database table with a button and insert into it with another用一个按钮选择一个数据库表,然后用另一个按钮插入它
【发布时间】:2012-10-13 09:06:12
【问题描述】:

我想使用带有 Windows 窗体的实体框架来保存记录。在数据库上,我有许多彼此相似的表;它们都有自动增量 ID 列和一个字符串列。我想要的是创建一组按钮,当按下其中一个按钮时,它会用指定的表格填充列表框。此外,另一个固定按钮会将固定文本框中的字符串插入到之前按下的按钮选择的表格中。

问题是我不能在第二个按钮中使用创建的上下文项。

这是左侧按钮之一的代码:

private void btnBB_Click(object sender, EventArgs e)
    {
        lbItems.DataSource = GsmContext.bbler;
        lbItems.DisplayMember = "bb";
        bb = new bbler();
        bb.bb = txtItem.Text;
        GsmContext.AddTobbler(bb);
    }

这是在文本框中保存项目的代码:

 private void SaveItem(object sender, EventArgs e)
    {
        if (txtItem.Text == string.Empty)
        { this.errorProvider1.SetError(txtItem, "Değer girin"); }
        else
        {
            try
            {
                GsmContext.SaveChanges();
                txtItem.Clear();
            }
            catch (SqlException x)
            {
                MessageBox.Show(x.Message);
            }
        }
    }

【问题讨论】:

  • 我想在另一个按钮点击事件中使用上下文项。

标签: c# windows forms frameworks entity


【解决方案1】:

这就是我得到的。我的实体框架模型定义了数据库中的所有类。然后我创建了一个接口 IRepository 和一个 DataRepository 类。

public interface IRepository<T> : IDisposable where T : class
{
    IQueryable<T> Fetch();
    IEnumerable<T> GetAll();
    IEnumerable<T> Find(Func<T, bool> predicate);
    T Single(Func<T, bool> predicate);
    T First(Func<T, bool> predicate);
    void Add(T entity);
    void Delete(T entity);
    void Attach(T entity);
    void Detach(T entity);
    void UpdateChanges(T entity);
    void SaveChanges();
    void SaveChanges(SaveOptions options);

}


public class DataRepository<T> : IRepository<T> where T : class
{

    private ObjectContext _context;

    private IObjectSet<T> _objectSet;

    public DataRepository()
        : this(new ModelContainer()) //ModelContainer is the name of the EF model class.
    {
    }

    public DataRepository(ObjectContext context)
    {
        _context = context;
        _objectSet = _context.CreateObjectSet<T>();
    }

    public IQueryable<T> Fetch()
    {
        return _objectSet;
    }

    public IEnumerable<T> GetAll()
    {
        return Fetch().AsEnumerable();
    }

    public IEnumerable<T> Find(Func<T, bool> predicate)
    {
        return _objectSet.Where<T>(predicate);
    }

    public T Single(Func<T, bool> predicate)
    {
        return _objectSet.Single<T>(predicate);
    }

    public T First(Func<T, bool> predicate)
    {
        return _objectSet.First<T>(predicate);
    }

    public void Delete(T entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        _objectSet.DeleteObject(entity);
    }

    public void Delete(Func<T, bool> predicate)
    {
        IEnumerable<T> records = from x in _objectSet.Where<T>(predicate) select x;

        foreach (T record in records)
        {
            _objectSet.DeleteObject(record);
        }
    }

    public void Add(T entity)
    {
        if (entity == null)
        {
            throw new ArgumentNullException("entity");
        }

        _objectSet.AddObject(entity);
    }

    public void Attach(T entity)
    {
        _objectSet.Attach(entity);
    }

    public void Detach(T entity)
    {
        _objectSet.Detach(entity);
    }

    public void UpdateChanges(T entity)
    {
        Add(entity);
        _context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
        SaveChanges();
    }

    public void SaveChanges()
    {
        _context.SaveChanges();
    }

    public void SaveChanges(SaveOptions options)
    {
        _context.SaveChanges(options);
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_context != null)
            {
                _context.Dispose();
                _context = null;
            }
        }
    }
}

然后像这样选择记录:

    public IList<MyDbClass> GetMyDbClassData()
    {
        IList<MyDbClass> myDbClassData = null;
        using (IRepository<MyDbClass> repository = new DataRepository<MyDbClass>())
        {
            myDbClassData = (from x in repository.GetAll()
                             select x).ToList();
        }
        return myDbClassData;
    }

创建新记录:

    public void CreateUser(User user)
    {
        using (IRepository<User> repository = new DataRepository<User>())
        {
            repository.Add(user);
            repository.SaveChanges();
        }
    }

【讨论】:

  • 感谢您的回答,这对我来说太复杂了。我知道这个问题搞砸了,但我不知道该怎么说。
  • 您能告诉我您的应用程序中的 GSMContext 类是什么吗?
  • 你能告诉我这个类的代码吗? AddTobler 在做什么?
  • 这里是表单的代码页:pastebin.com/ZDc0nT3b。表名是 bbler,因此向其中添加项目将是 AddTobbler。
  • 好的。您需要做的是在每次使用时创建一个新的 GSMContext 实例,并将其包装在 using 语句中。您可能需要更改结构以接受对象并将其添加到方法中。然后该方法将在 using 块中创建一个新的 gsmcontext 实例,您可以在那里保存更改。
猜你喜欢
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2011-10-28
  • 1970-01-01
相关资源
最近更新 更多