2012-08-11 99 views
9

我正在做一个Windows Phone应用程序,我有一个在Azure中运行的WebApi。如何使用可移植类库和EF代码优先?

我为我的“模型”项目使用新的“可移植类库”(http://msdn.microsoft.com/en-us/library/gg597391.aspx),这是因为我的WebApi项目(这是一个normal ASp.NET MVC 4项目)和我的Windows Phone项目。

这很好用,模型(POCO)类被序列化和反序列化,就像我想的那样。

现在我想开始存储一些我的Models/POCO对象,并希望为此使用EF Code-first,但这是一个问题,因为我无法将EntityFramework程序集添加到“可移植类库“项目,我真的不想或者因为我只需要我的Models项目中的一小部分(属性)。

那么,任何建议如何一个方法这是最好的方式?

UPDATE: 嗯,好像我其实可以添加的EntityFramework组件项目,但并没有真正帮助我,因为我的属性需要System.ComponentModel.DataAnnotations哪些不能用生活在Windows Phone上使用。 还有什么建议吗?

回答

12

请勿使用属性。相反,使用流畅的API并为持久性(EF)创建单独的程序集,它将引用您的模型程序集。持久性程序集将被您的WebAPI图层使用。

+0

谢谢,不知道EF有一个流利的API。看起来像你在那里建议的一个很好的解决方案,我会试试看。 – 2012-08-12 12:40:35

+0

知道这是很长的时间,因为我问这个问题,但这种方法对我来说工作非常好 - 谢谢:) – 2013-06-11 07:10:35

+1

说明如何做到这一点? – sabbour 2013-07-21 07:56:44

3

当我需要在多个平台我的域名项目,我通常:

  1. 创建的域代码
  2. 为每个平台创建一个特定于平台的类库标准的.NET类库项目
  3. 对于每个特定于平台的类库,我将标准.NET类库中的文件添加为链接(添加现有文件 - >作为链接),因此当您编辑链接文件或原始文件时它们会自动更新。
  4. 当我将一个新文件添加到.NET类库时,我将它添加为指向特定于平台的类库的链接。
  5. 平台特定的属性(即作为DataAnnotations-assembly一部分的Table和ForeignKey)可以使用预处理器标签选择出来。比方说,我有一个.NET类库带班并与链接的文件一个Silverlight项目,那么我就可以做包括.NET特有的属性:

    #if !SILVERLIGHT 
    [Table("MyEntityFrameworkTable")] 
    #endif 
    public class MyCrossPlatformClass 
    { 
        // Blah blah blah 
    } 
    

,只包括DataAnnotations - .NET类库中的程序集。

我知道它比使用可移植类库更多的工作,但不能像上例中那样在PCL中选择属性,因为只允许引用共享程序集(这又是DataAnnotations不是) 。

7

我使用了比Mikkel Hempel's更改的方法,而不需要使用预处理指令。

  1. 创建一个标准。.NET类库,称之为模型
  2. 创建表示要共享

    public partial class Person 
    { 
        public int Id { get; set; } 
        public string Name { get; set; } 
    } 
    
  3. 对于不可移植的代码(如DataAnnotations)什么是局部类,创建另一个部分类,并使用元数据

    [MetadataTypeAttribute(typeof(Person.Metadata))] 
    public partial class Person 
    { 
        internal sealed class Metadata 
        { 
         private Metadata() { } // Metadata classes shouldn't be instantiated 
    
         // Add metadata attributes to perform validation 
         [Required] 
         [StringLength(60)] 
         public string Name; 
        } 
    } 
    
  4. 创建一个可移植类库,和从第2步添加类“作为链接”