zoukankan      html  css  js  c++  java
  • Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)

    Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)

    目录

    • 导言
    • 软件需求
    • 数据库实现
    • Data Access层实现
    • Web Service层实现
    • Silverlight客户端实现
    • 结语

    导言

    Silverlight 2支持JSON、Web Service、WCF以及Sockets等新特性对数据CRUD操作,这个系列用实例结合数据库一步一步的图文描述来学习一下Silverlight 2 beta 1中进行数据库的CRUD操作方面的实战能力。

    这篇文章介绍如何在Silverlight 2 beta 1中使用LINQ to SQL进行数据CRUD操作。我把这个实例大致分为3层。

    架构

    这里多说几句:微软发布的是Silverlight 2 beta1 并不是Silverlight 2.0,也不是Silverlight 2.0的Beta 1,但是现在很多Blog、新闻把Silverlight 2 beta1 错误的理解成了Silverlight 2.0或者Silverlight 2.0 Beta 1,在这里特地说明一下,真正的是Silverlight 2 beta1 并不是Silverlight 2.0,也不是Silverlight 2.0的Beta 1!希望初学者不要误解这个“概念”了。

    软件需求

    • Silverlight 2 (beta1)
    • Visual Studio 2008
    • SQL 2005 Express with Management Studio

    数据库实现

    这一篇,我们设计一个科技成果表。包含以下字段:成果编号,名称,类型,完成时间,成果截图,负责人,成果授予单位。为了演示,数据类型我没有具体定义了。如下所示:

    科技成果表

    Data Access层实现

    目前在数据访问层有很多技术可以使用,像NHibernate、NetTiers 、LINQ to SQL、Entity Framework、Astoria (ADO.NET Data Services) 。VS2008为我们提供了OR设计器(LINQ to SQL技术)可视化的编辑环境,来映射数据表。首先在Visual Studio 2008创建Silverlight工程然后添加LINQ to SQL。下面一步一步讲解一下:

    第一步:新建一个Silverlight工程,我命名为:YJingLee.Academe。并选择ASP.NET Web Site用来托管Silverlight应用程序。

    新建Silverlight工程

    第二步:在Web项目中添加LINQ to SQL。

    添加LINQ to SQL

    这一步,VS会提示你,新建一个App_Code目录,把Academe.dbml文件放到这个文件夹下面

    提示

    第三步:映射表。我们把数据库表拖到OR设计器中,

    映射表

    第三步:定义数据契约。这是只需要在OR设计器修改Serialization属性为Unidirectional。

    定义数据契约

    另外,为了实现更新操作方法,我们在这里修改每个字段的属性为UpdateCheck=UpdateCheck.Never。这时在cs文件中,设计器自动生成了一些代码。为了说明问题在这里我贴出相关不完整的代码。

    [Table(Name="dbo.Product")]
    [DataContract()]
    public partial class Product :
    INotifyPropertyChanging, INotifyPropertyChanged
    {    
        public Product()
        {
            this.Initialize();
        }    
        [Column(Storage="_ProductID", AutoSync=AutoSync.OnInsert,
        DbType="Int NOT NULL IDENTITY",IsPrimaryKey=true, 
        IsDbGenerated=true,UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=1)]
        public int ProductID{  }
        
        [Column(Storage="_ProductName", DbType="VarChar(100)",
        UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=2)]
        public string ProductName{  }
        
        [Column(Storage="_ProductType", DbType="VarChar(100)",
         UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=3)]
        public string ProductType{  }
        
        [Column(Storage="_CompleteTime", DbType="VarChar(100)",
         UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=4)]
        public string CompleteTime{  }
        
        [Column(Storage="_ProductImage", DbType="VarChar(300)",
        UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=5)]
        public string ProductImage{  }
        
        [Column(Storage="_Principal", DbType="VarChar(100)",
        UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=6)]
        public string Principal{  }
        
        [Column(Storage="_AwardUnit", DbType="VarChar(100)", 
        UpdateCheck=UpdateCheck.Never)]
        [DataMember(Order=7)]
        public string AwardUnit{  }
        private void Initialize()
        {
            OnCreated();
        }
        
        [OnDeserializing()]
        [System.ComponentModel.
        EditorBrowsableAttribute(EditorBrowsableState.Never)]
        public void OnDeserializing(StreamingContext context)
        {
            this.Initialize();
        }
    }

    这里,我们可以看到,VS自动为表(这里映射为类)添加了DataContract属性,为序列化的成员添加了DataMember特性,同时设置了DataMember特性的Order属性为WCF提供序列化的顺序。另外,增加了一个序列化OnDeserializing事件,这个事件在反序列化之前发生,用于初始化类成员。

    Web Service层实现

    服务层就是在Silverlight客户端与Web服务端提供一个通道,官方推荐使用WCF来读取,当然ASMX也可以。我想不久将来微软可能专门为Silverlight设计一个Silverlight-Enabled WCF Service,不过现在使用WCF Service也可以访问,使用这个的时候一定要注意在web.config文件中把wsHttpBinding改为basicHttpBinding。

    第一步:添加WCF服务

    添加WCF服务

    第二步:定义服务契约。我们为WCF Service提供的增删查改方法定义服务契约。

    [ServiceContract]
    public interface IAcademeService
    {
        [OperationContract]
        List<Product> GetAllProducts();
    
        [OperationContract]
        Product SaveProduct(Product product);
    
        [OperationContract]
        void DeleteProduct(Product product);
    }

    第三步:实现服务:为增删查改方法具体实现。

    在这里,提供一个小技巧,在IAcademeService下点击小箭头,选择实现接口,VS自动为我们生成了上面定义的没有实现的方法。

    小技巧

    接着我们完成这些方法:其中SaveProduct方法用于更新和插入数据,这里使用了LINQ to SQL语句。

    public class AcademeService : IAcademeService
    {
        public List<Product> GetAllProducts()
        {
            AcademeDataContext db = new AcademeDataContext();
            var products = from p in db.Products
                           select p;
            return products.ToList<Product>();
        }
    
        public Product SaveProduct(Product product)
        {
            AcademeDataContext db = new AcademeDataContext();
            if (product.ProductID > 0)
            {
                //更新记录
                db.Products.Attach(product, true);
            }
            else
            {
                //插入记录
                db.Products.InsertOnSubmit(product);
            }
            db.SubmitChanges();
            return product;
        }
    
        public void DeleteProduct(Product product)
        {
            AcademeDataContext db = new AcademeDataContext();
            db.Products.Attach(product, true);
            db.Products.DeleteOnSubmit(product);
            db.SubmitChanges();
        }
    }

    第四步:配置web.cofig文件。只需要把wsHttpBinding改为basicHttpBinding

            <serviceBehaviors>
                <behavior name="AcademeServiceBehavior">
                  <serviceMetadata httpGetEnabled="true"/>
                 <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service behaviorConfiguration="AcademeServiceBehavior" 
               name="AcademeService">
                <endpoint address="" binding="basicHttpBinding" 
                  contract="IAcademeService">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" 
                  contract="IMetadataExchange"/>
            </service>
        </services>
    </system.serviceModel>

    第五步:设置Web应用程序的端口号。把器端口号设置为固定端口52600,在浏览器中查看服务是否正常。

    到此,编译一下Web项目,我们已经完成了所有的事情了,下一步就是在Silverlight中调用这个服务了。

    这篇就写到这里了。下一篇完成在Silverlight中调用。

    下一篇:Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)

  • 相关阅读:
    bzoj 1176 cdq分治套树状数组
    Codeforces 669E cdq分治
    Codeforces 1101D 点分治
    Codeforces 1100E 拓扑排序
    Codeforces 1188D Make Equal DP
    Codeforces 1188A 构造
    Codeforces 1188B 式子转化
    Codeforces 1188C DP 鸽巢原理
    Codeforces 1179D 树形DP 斜率优化
    git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
  • 原文地址:https://www.cnblogs.com/lyj/p/1164713.html
Copyright © 2011-2022 走看看