Entity Framework select



ref https://msdn.microsoft.com/zh-tw/library/bb399739(v=vs.100).aspx
產生 School .edmx 檔案 (Entity Framework 快速入門)


//select
        TravelEntities schoolContext = new TravelEntities();
        using (TravelEntities te = new TravelEntities())
        {
            var user = from a in te.Spots
                       where a.Id == ListBoxSpot.SelectedValue
                       select a;

            foreach (Spot num in user)
            {
                TextBoxName.Text = num.Tel;
            }
        }


 // like
            var user = from a in te.Hotels
                       where a.Addr.Contains("tw")
                       select a;


//modify
        TravelEntities schoolContext = new TravelEntities();
        using (TravelEntities te = new TravelEntities())
        {
            var user = from a in te.Spots
                       where a.Id == ListBoxSpot.SelectedValue
                       select a;

            foreach (Spot num in user)
            {
                num.Name = num.Name + "_";
                schoolContext.Entry(num).State = EntityState.Modified;
                schoolContext.SaveChanges();
            }
        }











from https://blog.csdn.net/weixin_43602710/article/details/93638575


更新数据 第一种方法:

先查询记录,然后修改相应的属性。此方法虽然多了一个查询步骤,但是也由此利用了EF的自动跟踪功能,后续操作比较方便。

比如,生成的SQL语句只会去修改相应的修改过的字段。

而且经测试发现,如果实体属性值没有改变,不会生成SQL语句,比如将下面的代码执行两次,第二次 SaveChanges() 方法不会执行SQL更新语句(注:由于还是会执行一次查询,所以运行效率并没有显著提升)

            TestDbContext db = new TestDbContext();
            var test = db.Tests.Find(1);
            test.Remarks = "更新字段方法1";

            db.SaveChanges();

第二种方法:

直接创建一个新的实体类,然后修改实体对象的状态。此方法虽然少了一个查询步骤,但生成的SQL语句将会修改全部字段,而且还要确保 ID 值存在。(注意:由于会修改全部字段,没有设置的字段会被设置为null

            TestDbContext db = new TestDbContext();
            Test test = new Test() { ID = 1, Remarks = "更新字段方法2" };
            db.Entry(test).State = System.Data.Entity.EntityState.Modified;

            db.SaveChanges();

第三种方法:

创建一个实体类,将实体附加到数据库上下文,然后修改相应属性值的修改标识为 true ,此方法生成的SQL语句与第一种方法一样,比较简洁,而且还少了查询步骤,只是后续的操作比较麻烦,因为要手动设置各个属性的修改标识,还要确保 ID 值存在。

            TestDbContext db = new TestDbContext();
            Test test = new Test() { ID = 1, Remarks = "更新字段方法3" };
            db.Tests.Attach(test);
            db.Entry(test).Property("Remarks").IsModified = true;

            db.SaveChanges();

生成的SQL语句(使用 SQL Server Profiler 跟踪数据库所得): 第一种方法:(注:第一种方法的代码执行一次后再次执行没有跟踪到更新数据库的SQL语句)

exec sp_executesql N‘UPDATE [dbo].[Tests]
SET [Remarks] = @0
WHERE ([ID] = @1)
‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法1‘,@1=1

第二种方法:(注:查看SQL语句可知,使用此方法如果不注意可能会导致数据被错误修改)

exec sp_executesql N‘UPDATE [dbo].[Tests]
SET [Name] = NULL, [Email] = NULL, [Remarks] = @0
WHERE ([ID] = @1)
‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法2‘,@1=1

第三种方法

exec sp_executesql N‘UPDATE [dbo].[Tests]
SET [Remarks] = @0
WHERE ([ID] = @1)
‘,N‘@0 nvarchar(max) ,@1 bigint‘,@0=N‘更新字段方法3‘,@1=1


















from https://medium.com/sally-thinking/%E7%A8%8B%E5%BC%8F%E5%AD%B8%E7%BF%92%E4%B9%8B%E8%B7%AF-day28-c-ado-net-entity-framework-%E7%89%A9%E4%BB%B6%E9%97%9C%E8%81%AF%E5%B0%8D%E6%87%89-4b27943af679




            using (var db = new Model1())
            { // Create and save a new Blog 
                var account = new Account { ID = "3",PW = "1", DeptID = 1 }; //造一個Blog加到Blogs資料集裡面
                db.Account.Add(account); //存入db資料內容類別裡
                db.SaveChanges();
                // Display all Blogs from the database


                var query = from b in db.Account
                            where b.ID == login.UserName && b.PW==login.Password                             
                            orderby b.ID
                            select b;

                //Console.WriteLine(“All blogs in the database:”);
                foreach (var item in query)
                {
                    Console.WriteLine(item.ID);
                } //將資料列成清單
                Console.WriteLine("Press any key to exit…");
                Console.ReadKey();
            }
        }


//remove
            using (var db = new Model1())
            {
                var account = db.Account.Find(ID);
                db.Account.Remove(account);
                db.SaveChanges();
            }




namespace Finance
{
    using System;
    using System.Collections.Generic;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.Data.Entity.Spatial;

    [Table("Account")]
    public partial class Account
    {
        [StringLength(20)]
        public string ID { get; set; }

        [Required]
        [StringLength(20)]
        public string PW { get; set; }

        public int DeptID { get; set; }

        public int? Enable { get; set; }

        public DateTime? AddDate { get; set; }
    }
}


from https://stackoverflow.com/questions/15336248/entity-framework-5-updating-a-record

//update


db.Users.Attach(updatedUser);
var entry = db.Entry(updatedUser);
entry.Property(e => e.Email).IsModified = true;
// other changed properties
db.SaveChanges();


var original = db.Users.Find(updatedUser.UserId);

if (original != null)
{
    original.BusinessEntityId = updatedUser.BusinessEntityId;
    original.Email = updatedUser.Email;
    db.SaveChanges();
}  





加入>新增項目>Data>ADO.NET實體模型

補充:實體資料模型
實體資料模型 (EDM) 是描述資料結構的概念集,不論其預存形式為何。

Image for post

模型:EF Designer

Image for post
Image for post
Image for post

備註
- 不把連線字串寫死,而是寫成設定檔
將App.Config中的連接設定儲存為 的用意?
重要性:連線字串為資料類別的名稱,程式設計會使用到

Image for post
Image for post

注意:必須勾選產生的物件名稱複數化或單數化
用意:單數負數正規化,避免程式設計過程中的混肴

Image for post











留言

熱門文章