• 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操作(下)

  • 相关阅读:
    JVM
    OLAP
    rocketMq学习
    redis的使用小记
    CRT配置端口转发
    冒泡排序
    spring AOP-切面编程
    linux下对jar包和war包进行重新打包
    oracle-sql性能优化
    遍历List,根据子项的某个属性分组
  • 原文地址:https://www.cnblogs.com/lyj/p/1164713.html
Copyright © 2020-2023  润新知