Xamarin Forms和EntityFramework属性兼容性

我有一个使用C#WPFASP.NET WebAPIEntity Framework客户端/服务器解决方案 。 客户和服务器分支在他的项目中共享模型 。 现在我正在尝试创建一个新客户端,使用Xamarin Forms并共享模型,但entity framework属性MaxLengthIndexNotMapped等) 在PCL不兼容 。 所以这就是我尝试过的东西:

将Microsoft.EntityFrameworkCore导入PCL模型

如此处所述,您应该能够将entity framework与Xamarin表单一起使用,因此我将PCL转换为NetStandard 1.3,并且它可以工作,允许每个EntityFramework属性。 但是现在服务器项目与该标准不兼容,我无法在模型项目中添加prism和Newtonsoft.Json等软件包。

使用诱饵和开关技巧模拟Xamarin表单的属性

我已经尝试了这里描述的方法,基于在模型PCL中创建自定义属性,并在类库中重新定义它们。 MyClient.Droid和MyClient.UWP重新定义属性,将它们留空,MyServer将使用Entity Frameworkfunction重新定义它们。

自定义IndexAttribute – 模型PCL:

 namespace Model.Compatibility { public class IndexAttribute : Attribute { public IndexAttribute() { } } } 

自定义IndexAttribute – 服务器端:

 [assembly: TypeForwardedToAttribute(typeof(Model.Compatibility.IndexAttribute))] namespace Model.Compatibility { public class MockedIndexAttribute : System.ComponentModel.DataAnnotations.Schema.IndexAttribute { public MockedIndexAttribute() { } } } 

我测试这个var attribute = new Model.Compatibility.IndexAttribute();调用var attribute = new Model.Compatibility.IndexAttribute(); 。 永远不会调用MockedIndexAttribute构造函数。

创建共享项目而不是PCL

这种方式有点混乱,但看起来很有效。 只需为模型创建一个新的共享项目,并使用这样的条件标志:

 #if !__MOBILE__ [NotMapped, Index] #endif public Guid Id { get; set; } 

我目前还没有完全部署这种方法,但是如果我不能让前两种方法都不起作用,我将继续这样做。

编辑 – 尝试使“诱饵和开关属性”方法工作

当@AdamPedley sugested和这个线程,我已经重新定义了一个新的PCL(Xamarin.Compatibility)中的IndexAttribute,使用与原始名称相同的名称空间:

 namespace System.ComponentModel.DataAnnotations.Schema { [AttributeUsage(AttributeTargets.Property, AllowMultiple = true)] public class IndexAttribute : Attribute { public IndexAttribute() { } } } 

现在,我的PCL模型包含对Xamarin.Compatibility的引用,因此我可以在我的模型属性中使用Index属性:

 [Index] public Guid Id { get; set; } 

然后,从我的Server项目中,我调用下一行代码来检查调用的构造函数,自定义属性或EntityFramework定义的属性:

 PropertyInfo prop = typeof(MyClass).GetProperty("Id"); object[] attributes = prop.GetCustomAttributes(true); 

调用的构造函数是自定义构造函数,因此它不起作用,因为它必须调用EntityFramework定义的属性。 这是我不知道的事情,是什么机制使我的模型的PCL选择自定义属性或EF属性取决于调用程序集。

我还在我的服务器项目中添加了一个名为TypeForwarding.Net.cs的文件( 此处为sugested),其中包含:

 [assembly: TypeForwardedTo(typeof(IndexAttribute))] 

但仍然没有工作。

我相信EF流畅的API是PCL和NetStandard友好的。 因此,您可以创建POCO对象,并让流畅的api执行跨平台映射,而不是使用属性。 msdn.microsoft.com/en-us/library/jj591617(v=vs.113).aspx

注意:我使用EF6和PCL项目在MVC / WPF / Mobile上共享项目