如何使用Portable Class Library和EF Code-first?

时间:2012-08-11 21:18:04

标签: entity-framework-4.1 portable-class-library

我正在做一个Windows Phone应用程序,我在Azure中运行WebApi。

我正在使用新的“可移植类库”(http://msdn.microsoft.com/en-us/library/gg597391.aspx)来处理我的“模型”项目,该项目在我的WebApi项目之间共享(这是一个normale ASp.NET MVC 4项目)和我的Windows Phone项目。

这很好用,模型(POCO)类按照我的要求进行序列化和反序列化。

现在我想开始存储我的一些Models / POCO对象,并希望首先使用EF Code-first,但这是一个问题,因为我无法将EntityFramework程序集添加到我的“Portable Class Library”项目,我真的不想,因为我只需要我的模型项目中的一小部分(属性)。

那么,对于如何采用这种方法的最佳方法有任何建议吗?

更新: 好吧,看起来我实际上可以将EntityFramework程序集添加到项目中,但这对我没有帮助,因为我需要使用的属性存在于System.ComponentModel.DataAnnotations中,而这些属性不能在Windows Phone上使用。 还有什么建议吗?

3 个答案:

答案 0 :(得分:12)

不要使用属性。使用流畅的API代替并为持久性(EF)创建单独的程序集,它将引用您的模型程序集。您的WebAPI层将使用持久性程序集。

答案 1 :(得分:7)

我使用的方法比Mikkel Hempel更改,无需使用预处理指令。

  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步“As Link”中的类

答案 2 :(得分:3)

当我需要跨多个平台的域项目时,我通常会这样做:

  1. 为域代码
  2. 创建标准的.NET类库项目
  3. 对于每个平台,我创建一个特定于平台的类库
  4. 对于每个平台特定的类库,我将标准.NET类库中的文件添加为链接(添加现有文件 - > As链接),因此当您编辑链接文件或原始文件时,它们会自动更新文件。
  5. 当我将新文件添加到.NET类库时,我将其添加为平台特定类库的链接。
  6. 可以使用预处理器标签选择平台特定属性(即Table和ForeignKey,它是DataAnnotations-assembly的一部分)。假设我有一个带有类的.NET类库和带有链接文件的Silverlight项目,那么我可以通过执行以下操作来包含特定于.NET的属性:

    #if !SILVERLIGHT
    [Table("MyEntityFrameworkTable")]
    #endif 
    public class MyCrossPlatformClass 
    {
        // Blah blah blah
    }
    
  7. 并且只在.NET类库中包含DataAnnotations-assembly。

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