我正在做一个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上使用。 还有什么建议吗?
答案 0 :(得分:12)
不要使用属性。使用流畅的API代替并为持久性(EF)创建单独的程序集,它将引用您的模型程序集。您的WebAPI层将使用持久性程序集。
答案 1 :(得分:7)
我使用的方法比Mikkel Hempel更改,无需使用预处理指令。
创建一个表示您想要共享内容的分部类
public partial class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
对于非可移植代码(如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;
}
}
创建一个可移植类库,并添加第2步“As Link”中的类
答案 2 :(得分:3)
当我需要跨多个平台的域项目时,我通常会这样做:
可以使用预处理器标签选择平台特定属性(即Table和ForeignKey,它是DataAnnotations-assembly的一部分)。假设我有一个带有类的.NET类库和带有链接文件的Silverlight项目,那么我可以通过执行以下操作来包含特定于.NET的属性:
#if !SILVERLIGHT
[Table("MyEntityFrameworkTable")]
#endif
public class MyCrossPlatformClass
{
// Blah blah blah
}
并且只在.NET类库中包含DataAnnotations-assembly。
我知道这比使用可移植类库更有用,但是你不能像上面的例子那样选择PCL中的属性,因为你只允许引用共享程序集(同样不是DataAnnotations)。