9

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

我正在为我的“模型”项目使用新的“便携式类库”(http://msdn.microsoft.com/en-us/library/gg597391.aspx),该项目在我的 WebApi 项目之间共享(这是一个普通的 ASp.NET MVC 4 项目)和我的 Windows Phone 项目。

这很好用,模型(POCO)类可以按照我的意愿进行序列化和反序列化。

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

那么,对于如何以最佳方式进行处理有什么建议吗?

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

4

3 回答 3

12

不要使用属性。改用 fluent API 并为持久性 (EF) 创建单独的程序集,该程序集将引用您的模型程序集。您的 WebAPI 层将使用持久性程序集。

于 2012-08-12T09:15:38.247 回答
7

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

  1. 创建一个标准的 .NET 类库,将其命名为 Models
  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 步“作为链接”添加类

于 2013-07-21T09:41:10.560 回答
3

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

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

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

并且仅在 .NET 类库中包含 DataAnnotations 程序集。

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

于 2013-06-10T15:40:04.610 回答