C# entityframework 数据保存(八)

Entity Framework 通过实体变更追踪(ChangeTracker)来维护实体的变更情况,最终通过调用SaveChanges将变更保存到数据库,有人认为着很简单,其实不然,下面以Students为例添加和更新数据

添加

students

public class students
    {
        public string id { get; set; }
        public string name { get; set; }
        public int age { get; set; }

        public DateTime createtime { get; set; }

        public DateTime modifydate { get; set; }
    }

studentsMap

public studentsMap()
        {
            ToTable("students");
            HasKey(p => p.id);
            Property(p => p.id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None).IsRequired();
            Property(p => p.name).HasColumnType("VARCHAR").HasMaxLength(20).IsRequired();
            Property(p => p.createtime).IsRequired();
            Property(p => p.modifydate).IsRequired();
            Property(p => p.age).IsRequired();
        }

demo

using (var db=new Model1())
            {
                students ss = new students()
                {
                    id = "1",
                    name = "chen",
                    age = 99,
                    createtime = DateTime.Now,
                    modifydate=DateTime.Now
                };
                db.StudentTests.Add(ss);
                if (db.SaveChanges() > 0)
                    MessageBox.Show("success");
                else
                    MessageBox.Show("failed");
            }

更新

更新是最为复杂的操作,不知道平时大家都是怎么操作的,因为entity framework没有对应Update的方法,或许你会立马想到将实体的状态修改为modified,这真的管用吗?

public students createStu()
        {
            return new students()
            {
                id = "1",
                name = "chen",
                age = 199,
                createtime = DateTime.Now,
                modifydate = DateTime.Now
            };
        }
using (var db = new Model1())
            {
                students ss = createStu();
                var id1 = db.StudentTests.Where(p => p.id == "1").FirstOrDefault();
                if (id1 !=null)
                {
                    db.StudentTests.Attach(ss);
                    db.Entry(ss).State = System.Data.Entity.EntityState.Modified;
                    if (db.SaveChanges() > 0)
                        MessageBox.Show("success");
                    else
                        MessageBox.Show("failed");
                }
                
            }

此时更新失败,Attach的含义是,如果附加的对象存在于数据库中但是未被上下文追踪,那么使用attach将使得ss被追踪,但是ss已经存在,所以报相同键的错误,这时我们只需要设置关闭追踪即可解决这个问题。
在这里插入图片描述
关闭追踪AsNoTracking,需要注意修改实体的状态更改代码需要放在Attach方法后执行,关闭追踪后,更新数据库成功

using (var db = new Model1())
            {
                students ss = createStu();
                var id1 = db.StudentTests.AsNoTracking().Where(p => p.id == "1").FirstOrDefault();
                if (id1 !=null)
                {
                    db.StudentTests.Attach(ss);
                    db.Entry(ss).State = System.Data.Entity.EntityState.Modified;
                    if (db.SaveChanges() > 0)
                        MessageBox.Show("success");
                    else
                        MessageBox.Show("failed");
                }
                
            }

将实体状态更改为Modified是将实体全部字段进行更新,假如我们只想更改其中的某些字段则可以这么做

  1. 直接修改查询出来的实体的属性,并保存
using (var db = new Model1())
            {
                students ss = createStu();
                var id1 = db.StudentTests.Where(p => p.id == "1").FirstOrDefault();
                if (id1 !=null)
                {
                    id1.age = ss.age;
                    id1.name = ss.name;
                    if (db.SaveChanges() > 0)
                        MessageBox.Show("success");
                    else
                        MessageBox.Show("failed");
                }
                
            }
  1. 直接将ss附加到上下文,手动设置修改
using (var db = new Model1())
            {
                students ss = createStu();
                db.StudentTests.Attach(ss);
                db.Entry(ss).Property(p => p.age).IsModified = true;
                if (db.SaveChanges() > 0)
                    MessageBox.Show("success");
                else
                    MessageBox.Show("failed");

            }
  1. 使用Entry()CurrentValues.SetValues()解决并发赋值
using (var db = new Model1())
            {
                students ss = createStu();
                var id1 = db.StudentTests.Where(p => p.id == "1").FirstOrDefault();
                if (id1 !=null)
                {
                    db.Entry(id1).CurrentValues.SetValues(ss);
                    if (db.SaveChanges() > 0)
                        MessageBox.Show("success");
                    else
                        MessageBox.Show("failed");
                }
                
            }
  1. 批量更新
using (var db = new Model1())
            {
                var test = db.StudentTests
                    .Where(p => p.name == "chen").ToList();
                test.ForEach(p => p.age = 1234);
                db.SaveChanges();
            }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C# WinForms中,你可以使用不同的方法来保存窗口内的大量数据。以下是一些可能的方法: 1. 使用文件保存:将数据保存到文件中,可以使用文本文件、XML文件或二进制文件等。你可以使用System.IO命名空间中的类(如StreamWriter、XmlWriter或BinaryWriter)来写入数据,然后使用相应的读取类(如StreamReader、XmlReader或BinaryReader)来读取数据。 2. 使用数据保存:将数据保存数据库中,可以使用SQL Server、MySQL、SQLite等数据库。你可以使用ADO.NET或Entity Framework等技术来连接数据库,并执行插入、更新和查询等操作。 3. 使用序列化保存:将窗口内的对象数据进行序列化,然后保存到文件或数据库中。你可以使用.NET提供的序列化机制,如BinaryFormatter、XmlSerializer或DataContractSerializer等。通过将对象转换为字节流或XML格式,然后保存到文件或数据库中。 4. 使用设置保存:对于一些简单的配置信息或用户偏好设置,你可以使用应用程序设置来保存。在Visual Studio中,你可以通过项目属性窗口或Settings.settings文件来添加和管理应用程序设置。 5. 使用缓存保存:如果数据量不是很大且不需要长期保存,你可以使用缓存来保存数据。例如,你可以使用System.Runtime.Caching命名空间中的MemoryCache类来存储和检索数据。 根据你的具体需求和数据量大小,选择最合适的方法来保存窗口内的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值