9

Azure で WebApi を実行している Windows Phone アプリを実行しています。

「モデル」プロジェクトに新しい「ポータブル クラス ライブラリ」(http://msdn.microsoft.com/en-us/library/gg597391.aspx) を使用しています。これは、WebApi プロジェクト間で共有されている原因です (これは通常の ASP.NET MVC 4 プロジェクト) と私の Windows Phone プロジェクトです。

これはうまく機能し、モデル (POCO) クラスは思い通りにシリアル化および逆シリアル化されます。

ここで、モデル/POCO オブジェクトのいくつかの保存を開始し、そのために EF Code-first を使用したいと考えていますが、EntityFramework アセンブリを "Portable Class Library" プロジェクトに追加できないため、これは一種の問題です。私のモデルプロジェクトでは小さな部分(属性)しか必要ないので、本当にどちらもしたくありません。

では、これを最善の方法でアプローチする方法について何か提案はありますか?

更新:実際に EntityFramework アセンブリをプロジェクトに追加できるようですが、使用する必要がある属性は System.ComponentModel.DataAnnotations にあり、Windows Phone では使用できないため、実際には役に立ちません。 . まだ提案はありますか?

4

3 に答える 3

12

属性を使用しないでください。代わりに流暢な API を使用し、モデル アセンブリを参照する永続化 (EF) 用の別のアセンブリを作成します。Persistence アセンブリは、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 など) の場合は、別の部分クラスを作成し、Metadata を使用します。

    [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 アセンブリの一部である 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 に答える