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


作者:李永京YJingLee's Blog
出处:http://lyj.cnblogs.com
转载请注明此处,谢谢!

posted @ 2008-04-21 22:57 李永京 阅读(2508) 评论(21)  编辑 收藏 所属分类: Silverlight

  回复  引用  查看    
#1楼 2008-04-22 08:27 | 李战      
路过,学习+支持!
  回复  引用  查看    
#2楼 2008-04-22 09:21 | 生鱼片      
楼主的文章很详细啊
  回复  引用  查看    
#3楼 [楼主]2008-04-22 12:07 | 李永京      
@李战
呵呵!
  回复  引用  查看    
#4楼 [楼主]2008-04-22 12:08 | 李永京      
@生鱼片
还有很多没有说到呢,最近学习还没有彻底搞清楚呢。
  回复  引用  查看    
#5楼 2008-04-22 16:34 | jowo      
请问下:在IIS发布Siliverlight 2 与发布一般的网站是一样的吗?

  回复  引用  查看    
#6楼 [楼主]2008-04-22 17:00 | 李永京      
@jowo
这个还不是很理解,部署这个只要xap文件,然后在页面中使用<object>标签引用这个文件就可以了啊,具体可以参考托管程序自带的html文件中的编码。
至于涉及服务方面,可能编码还要改一改,因为我实例的编码,WCF服务和SL客户端是同一台机器。
  回复  引用  查看    
#7楼 2008-04-22 17:16 | jowo      
@李永京
这里所指的发布是说:用IP地址来访问,而不用localhost:端口来访问,就是IIS部署,

  回复  引用  查看    
#8楼 [楼主]2008-04-22 21:14 | 李永京      
@jowo
sl是跨平台的,只需在页面中引用这个文件就可以了,至于WCF调用服务,先把服务部署好,然后引用这个服务http地址应该可以。
  回复  引用  查看    
#9楼 2008-04-23 17:02 | linx [未注册用户]
下集要什么时候出来啊
  回复  引用  查看    
#10楼 [楼主]2008-04-23 17:25 | 李永京      
  回复  引用  查看    
#11楼 2008-04-24 15:26 | linx [未注册用户]
好快啊看到了.
我是菜鸟,想问一下:
如果我不是想用所有字段
var products = from p in db.Products
select p;
而是
var products = from p in db.Products
select new {a = p.ProductId, b = p.ProductName}
那么是否需要再定义一个新类,来修剪原来product表数据?
public class Productnew
{
public int productId{get;set;}
Public string productName{get;set;}
}
,然后数据的CRUD操作有该如何呢?
谢谢指点.



  回复  引用  查看    
#12楼 [楼主]2008-04-24 16:27 | 李永京      
@linx
可以啊,这个类在数据库没有表吧,那只是读取表中的某个字段重新组合和一个类,在CRUD同这一样啊,只要修改了某些字段,这个类就修改了,但是一般不这样做,这样只是显示数据常用。
  回复  引用  查看    
#13楼 2008-04-27 00:14 | 无常      

这里多说几句:微软发布的是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.0 Beta 1、Silverlight 2.0的Beta 1、Silverlight 2.0,
哪个是我电脑上装的这个2.030226.2?


  回复  引用  查看    
#14楼 [楼主]2008-04-27 00:25 | 李永京      
@无常
呵呵,被我说绕了啊??是微软发布的是Silverlight 2 beta1,其版本号为2.030226.2 Version: 2.0.30226.2
  回复  引用  查看    
#15楼 2008-04-27 22:58 | 无常      
@李永京
微软发布的是Silverlight 2 beta1 并不是Silverlight 2.0,也不是Silverlight 2.0的Beta 1,
这是你说的.
  回复  引用  查看    
#16楼 [楼主]2008-04-27 23:09 | 李永京      
@无常
对啊。
微软发布的是Silverlight 2 beta1,它并不是“Silverlight 2.0”,(名称)也不是“Silverlight 2.0的Beta 1”,是“Silverlight 2 beta1”,“Silverlight 2 beta1”的版本号为2.0.30226.2。但是名称是Silverlight 2 beta1。呵呵,真的有点绕!
  回复  引用  查看    
#17楼 2008-06-02 16:03 | 平静中的疯狂      
今天几乎大半天都在看LZ的文章,真是受教了。
  回复  引用  查看    
#18楼 [楼主]2008-06-02 16:31 | 李永京      
@平静中的疯狂
呵呵~~~
  回复  引用  查看    
#19楼 2008-06-13 13:57 | 菜无罪1      
安全性呢?如何保证wcf 的安全
  回复  引用  查看    
#20楼 [楼主]2008-06-13 16:11 | 李永京      
@菜无罪1
SL对WCF的安全性有了很好的支持了。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-24 17:58 编辑过
 
另存  打印
最新IT新闻:
· 万名Linux使用者向暴雪请愿Linux版《Diablo III》
· 56.com我乐网将全面转行 退出视频行业
· Joost借道TOM在线 将正式进军中国
· 微软副总裁公开承认Vista存在问题
· 互联网DNS存在重大漏洞 黑客可能控制网络流量