Xamarin Forms 和 EntityFramework 属性兼容性

2024-01-01

我有一个客户端/服务器解决方案 using C#, WPF, ASP.NET WebAPI and Entity Framework。客户端和服务器类分享模型在他的项目中。现在我正在尝试使用 Xamarin Forms 创建一个新客户端并将模型共享给,但是实体框架属性(MaxLength, Index, NotMapped等),是在 PCL 中不兼容。所以这是我尝试过的事情:

将 Microsoft.EntityFrameworkCore 导入到 PCL 模型

如上所述here https://blog.xamarin.com/building-android-apps-with-entity-framework/,您应该能够将实体框架与 Xamarin 表单一起使用,因此我将 PCL 转换为 NetStandard 1.3,并且它有效,每个 EntityFramework 属性都是允许的。但现在服务器项目与该标准不兼容,我无法在模型项目中添加像 prism 和 Newtonsoft.Json 这样的包。

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

我已经尝试过所描述的方法here https://stackoverflow.com/a/16046668/5147720,基于在模型 PCL 中创建自定义属性,并在类库中重新定义它们。 MyClient.Droid 和 MyClient.UWP 重新定义属性,将其留空,而 MyServer 将使用实体框架功能重新定义它们。

自定义 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();。 MockedIndexAttribute 构造函数永远不会被调用。

创建共享项目而不是 PCL

这种方式虽然有点乱,但看起来还是可行的。只需为模型创建一个新的共享项目,并使用如下条件标志:

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

我目前还没有完全部署这种方法,但如果我不能使前两种方法都不起作用,我会采用这种方法。

编辑 - 尝试使“诱饵和切换属性”方法发挥作用

正如@AdamPedley 所建议的并且this https://stackoverflow.com/a/27143002/5147720线程到,我在新的 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; }

然后,从我的服务器项目中,我调用下一行代码来检查调用了什么构造函数、自定义属性或 EntityFramework 定义的属性:

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

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

我还在我的服务器项目中添加了一个文件,名为 TypeForwarding.Net.cs(如建议的here https://stackoverflow.com/a/21368529/5147720),其中包含:

[assembly: TypeForwardedTo(typeof(IndexAttribute))]

但仍然不起作用。


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

Note:我通过一个使用 EF6 和 PCL 项目在 MVC / WPF / Mobile 之间共享的项目来完成此操作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin Forms 和 EntityFramework 属性兼容性 的相关文章

  • Qt 和 Sqlite 示例

    我正在寻找一些使用 Qt 的示例代码 它是带有 Sqlite 驱动程序的 SQL 模块 我需要示例的主要原因是我之前有 Qt 数据库接口的经验 并且 Sqlite 在字段类型方面有一些奇怪的行为 类型是按字段存储的 而不是按列存储的 The
  • -ffast-math 可以安全地用于典型项目吗?

    在回答我建议的问题时 ffast math 有评论指出这是危险的 我个人的感觉是 在科学计算之外 是可以的 我还假设严肃的金融应用程序使用定点而不是浮点 当然 如果你想在你的项目中使用它 最终的答案是在你的项目上测试它 看看它有多大影响 但
  • 从服务器下载图像(cUrl,但接受建议)C++

    我试图通过从服务器 网站 下载图像来设置旋转背景图像 并尝试使用curl 来执行此操作 但是在执行此操作方面取得了0 成功 我的代码的 缩短的 版本如下 我没有收到错误 但是 如何 临时 保存该图像以将其显示为背景 是否有图像 类型变量 或
  • std::map find 在 C++ 中不起作用[重复]

    这个问题在这里已经有答案了 我使用以下几行创建了一个哈希映射和一个迭代器 std map
  • 地图类容器的专用功能

    我想要专门为矢量和地图之类的容器设计一个函数模板 对于向量 我可以像下面那样做 但我不知道如何才能有一个专门版本的函数 该函数仅用于像地图这样的容器 include
  • 没有配置身份验证处理程序来处理该方案

    这是一个非常烦人的问题 我在我的 asp net core 项目上设置 cookie 身份验证 有时会出现此错误 有时不会 没有图案 它只是开始抛出错误 然后突然停止 然后再次开始 例外情况是 InvalidOperationExcepti
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 如何在建立上下文时设置连接超时-PrincipalContext

    using PrincipalContext ctx new PrincipalContext ContextType Domain Domain UserName Password UserPrincipal U new UserPrin
  • 使用c#在mac上启动外部进程

    我成功地使用 System Diagnostics Process Start 在 Windows 上启动我的外部单声道可执行文件 然而在mac上却失败了 我没有收到任何错误 只是什么也没发生 我尝试按以下方式进行操作 System Dia
  • 如何在 Windows 上的 GCC 中链接 CS50 C 库

    我是 编程新手 一直在尝试使用以下命令编译我的代码MinGW https en wikipedia org wiki MinGW GCC 但我尝试包括CS50 https en wikipedia org wiki CS50 cs50 c
  • 如何查看每秒更新的图表中的最后 10 个数据点?

    我有这个代码 private void timer Tick object sender EventArgs e timer Stop for int i 0 i lt TOTAL SENSORS i DateTime d DateTime
  • 将两个垂直滚动条相互绑定

    我在控件中有两个 TextBox 并且它们都有两个 VerticalScrollBar 我想在它们之间绑定 VerticalScrollBars 如果一个向上 第二个也会向上等等 如果可以的话我该怎么做 Thanks 不是真正的绑定 但它有
  • 大小为 k 的非连续子序列的最大值的最小值

    在开始之前 我希望这个问题不是重复的 我发现了几个类似的问题 但它们似乎都没有描述完全相同的问题 但如果它是重复的 我会很高兴看到一个解决方案 即使它与我的算法不同 我一直在尝试回答这个问题 https stackoverflow com
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 为什么使用 .AsEnumerable() 而不是转换为 IEnumerable

    扩展方法之一IEnumerable
  • 如何检查日期时间是否发生在今天?

    有没有比下面的代码更好的 net 方法来检查 今天 是否发生了 DateTime if newsStory WhenAdded Day DateTime Now Day newsStory WhenAdded Month DateTime
  • 在 C 中运行 setuid 程序的正确方法

    我有一个权限为4750的进程 我的Linux系统中存在两个用户 root 用户和 appz 用户 该进程继承以 appz 用户身份运行的进程管理器的权限 我有两个基本惯例 void do root void int status statu
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 将“C# 友好类型”名称转换为实际类型:“int” => typeof(int)

    我想得到一个System Type给定一个string指定 原始 类型C 友好名称 基本上与 C 编译器读取 C 源代码时的方式相同 我觉得描述我所追求的最好方式是单元测试的形式 我希望存在一种通用技术 可以使以下所有断言通过 而不是尝试对
  • C# 使用 .Equals() 比较两个 double

    我使用 ReShaper 当我用 比较两个双精度值时 它建议我应该使用 Math 具有公差的 ABS 方法 看 https www jetbrains com help resharper 2016 2 CompareOfFloatsByE

随机推荐