是否可以在不使用自定义集合访问器的情况下监视属性的更改?

尼克·埃斯特拉达(Nic Estrada)

当我在启用了延迟加载的虚拟外键导航属性上使用自定义集访问器时,Entity Framework Core不喜欢它。它在启动/配置期间引发运行时异常。我想每次设置这些属性之一时运行一些自定义代码。在没有EF Core大喊大叫的情况下,有什么办法可以实现这一目标?以下代码示例/说明:

public class CoilUnit
{
    [Key]
    public Guid Id { get; set; }

    [ForeignKey("project")]
    public virtual CoilProject Project { get; set; }
}
public class CoilProject
{
    [Key]
    public Guid Id { get; set; }
}

上面的设置在EF Core中可以正常工作,但并不能满足我的要求。

这就是我要的:

public class CoilUnit
{
    [Key]
    public Guid Id { get; set; }

    private CoilProject project;

    [ForeignKey("project")]
    public virtual CoilProject Project
    {
        get { return project; }
        set { project = value; /* Other code here */ }
    }
}
public class CoilProject
{
    [Key]
    public Guid Id { get; set; }
}

在代码方面,这可以满足我的要求,但是EF Core不喜欢它,并且在执行此操作时无法运行。

在这种情况下,有什么办法可以吃我的蛋糕吗?有什么方法/* Other Code */可以让EF Core正常运行,同时让它正常运行?

谢谢。

伊万·斯托夫

此问题与延迟加载和自定义属性设置程序无关,但与备份字段和影子FK属性名称之间存在冲突。

当应用于导航属性时,ForeignKeyattribute指定FK属性名称。如果不存在这样的属性,EF Core将使用该名称创建阴影属性

使用自动属性,后备字段名称由编译器生成,而不是 "project",因此没有问题。但是在第二种情况下,已经有一个名为的字段"project",因此EF Core决定这是该属性指定的FK属性。但当然不是,也不是预期的类型(GuidGuid?),因此是例外。

如果您使用的是常规FK属性/列名(如ProjectId),则不需要该属性,也不会出现问题。我敢肯定,您不在乎影子属性名称,而是在表列名称。

因此,解决此问题的一种方法是删除ForeignKey属性并使用fluent API配置FK列名称:

private CoilProject project;

public virtual CoilProject Project
{
    get { return project; }
    set { project = value; /* Other code here */ }
}

modelBuilder.Entity<CoilUnit>()
    .Property<Guid?>(nameof(CoilUnit.Project) + "Id")
    .HasColumnName("project");

另一种方法是保留属性,但将导航属性支持字段重命名为其他受支持的模式之一,例如"_project"

private CoilProject _project;

[ForeignKey("project")]
public virtual CoilProject Project
{
    get { return _project; }
    set { _project = value; /* Other code here */ }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:是否可以在不使用自定义适配器的情况下更改图像?

是否可以在不使用NPM的情况下使用自定义的TestCafé浏览器提供程序?

是否可以在不使用自定义窗口小部件的情况下将单个对话框字段映射到多个JCR属性?

是否可以在不使用XML的情况下为Spring创建自定义的Jackson对象映射器?

如何在不使用generate函数的情况下编写自定义工厂属性

是否可以在不使用Firebase的情况下为移动设备实现自定义推送通知?

使用Keycloak Java连接器,如何在不使用getGroupByPath的情况下获取自定义组属性?

如何在不使用自定义CSS的情况下将默认主题颜色深青色更改为蓝色

Android:如何在不使用自定义布局的情况下更改AlertDialog标题文本颜色和背景颜色?

我想在不使用标签栏控制器的情况下制作自定义标签栏

在春季,默认情况下是否可以对类型使用自定义序列化器/反序列化器?

是否可以在不创建自定义单元格类的情况下更改单元格的图像?

是否可以在不使用扩展程序/自定义帮助程序的情况下限制ustry.js中的循环?

是否可以在不使用Illustrator之类的编辑器的情况下更改svg中的线条粗细?

如何在不使用IB的情况下使用自定义UITabBar类创建UITabBarController?

在不使用Django本身的情况下测试自定义Django中间件

在不使用class关键字的情况下创建自定义元素

Video.js在不使用任何插件的情况下显示自定义消息

是否可以在其他选择更改不使用javascript的情况下选择更改的选项

是否可以在不使用属性名称的情况下获取属性的PropertyInfo?

在不使用JavaScript的情况下使用第n个孩子时是否可以访问n?

是否可以在不编写自定义特征类的情况下对类型进行模式匹配?

是否可以在不使用索引号的情况下访问json数组元素?

是否可以在不使用@WebServiceProvider的情况下访问JAX-WS中的原始请求XML?

是否可以在不使用静态字段的情况下对彼此的字段进行两次访问?

是否可以在不使用中间类的情况下访问 EF Core 中的共享 TPH 列?

是否可以在不使用 javascript 的情况下更改工具提示消息的背景和文本颜色?

是否可以在不使用JavaScript的情况下更改html内容?

是否可以在不更改访问语法的情况下用lambda替换属性?