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

C# 我是否可以在不使用自定义集访问器的情况下监视属性的更改?,c#,entity-framework-core,C#,Entity Framework Core,实体框架核心不喜欢在启用延迟加载的虚拟外键导航属性上使用自定义集访问器。它在启动/配置期间引发运行时异常。不过,每次设置其中一个属性时,我都希望运行一些自定义代码。我有没有办法不让EF Core对我大喊大叫?代码示例/澄清如下: 公共类CoilUnit { [关键] 公共Guid Id{get;set;} [外键(“项目”)] 公共虚拟CoilProject项目{get;set;} } 公共类线圈项目 { [关键] 公共Guid Id{get;set;} } 上面的设置在EF Core中运行

实体框架核心不喜欢在启用延迟加载的虚拟外键导航属性上使用自定义集访问器。它在启动/配置期间引发运行时异常。不过,每次设置其中一个属性时,我都希望运行一些自定义代码。我有没有办法不让EF Core对我大喊大叫?代码示例/澄清如下:

公共类CoilUnit
{
[关键]
公共Guid Id{get;set;}
[外键(“项目”)]
公共虚拟CoilProject项目{get;set;}
}
公共类线圈项目
{
[关键]
公共Guid Id{get;set;}
}
上面的设置在EF Core中运行得很好,但它没有达到我想要的效果

这就是我想要的:

公共类CoilUnit
{
[关键]
公共Guid Id{get;set;}
私人COIL项目;
[外键(“项目”)]
公共虚拟线圈项目
{
获取{return project;}
设置{project=value;/*此处的其他代码*/}
}
}
公共类线圈项目
{
[关键]
公共Guid Id{get;set;}
}
在代码方面,这是我想要的,但EF Core不喜欢它,并且在我这样做时无法运行

在这种情况下,有没有办法既吃蛋糕又吃蛋糕?有没有办法让
/*其他代码*/
正常运行,同时也让EF Core随心所欲


谢谢。

您可以使用其他属性来保留您的业务逻辑,EF不会映射这些逻辑

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

    private CoilProject project;

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

    [NotMapped]
    public virtual CoilProject ProjectNotMapped
    {
        get { return project; }
        set { project = value; /* Other code here */ } 
    }
}
没有getter或setter的其他属性也不会被映射:


您可以使用其他属性来保留您的业务逻辑,而EF不会映射这些逻辑

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

    private CoilProject project;

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

    [NotMapped]
    public virtual CoilProject ProjectNotMapped
    {
        get { return project; }
        set { project = value; /* Other code here */ } 
    }
}
没有getter或setter的其他属性也不会被映射:


这个问题与延迟加载和自定义属性setter无关,而是支持字段和卷影FK属性名称之间的冲突

应用于导航属性时,
ForeignKey
属性指定FK属性名称。如果不存在此类属性,EF Core将使用该名称创建

使用auto属性时,名称由编译器生成,并且不是“项目”,因此没有问题。但在第二种情况下,已经有名为
“project”
的字段,因此EF Core决定这是该属性指定的FK属性。但它当然不是,也不是预期的类型(
Guid
Guid?
),因此存在例外

如果使用传统的FK属性/列名(如
ProjectId
),则不需要该属性,也不会出现问题。我很确定您不关心影子属性名,而是表列名

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

private CoilProject project;

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


这个问题与延迟加载和自定义属性setter无关,而是支持字段和卷影FK属性名称之间的冲突

应用于导航属性时,
ForeignKey
属性指定FK属性名称。如果不存在此类属性,EF Core将使用该名称创建

使用auto属性时,名称由编译器生成,并且不是“项目”,因此没有问题。但在第二种情况下,已经有名为
“project”
的字段,因此EF Core决定这是该属性指定的FK属性。但它当然不是,也不是预期的类型(
Guid
Guid?
),因此存在例外

如果使用传统的FK属性/列名(如
ProjectId
),则不需要该属性,也不会出现问题。我很确定您不关心影子属性名,而是表列名

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

private CoilProject project;

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


添加附加逻辑的SetProject(CoilProject项目)方法是选项吗?这样您就可以保留默认的setter。@vvasch当然在技术上是可能的,但是在团队设置中,为了可维护性,除非我也禁用了默认setter,这会杀死EF Core。关键是要使类的“公共API”(可以说)在不触发附加逻辑的情况下设置CoilUnit.Project是不可能的。好的,我只是想确保您没有忽略显而易见的问题。对不起,我没有其他建议。添加附加逻辑的SetProject(CoilProject项目)方法是一个选项吗?这样您就可以保留默认的setter。@vvasch当然在技术上是可能的,但是在团队设置中,为了可维护性,除非我也禁用了默认setter,这会杀死EF Core。关键是要使类的“公共API”(可以说)在不触发附加逻辑的情况下设置CoilUnit.Project是不可能的。好的,我只是想确保您没有忽略显而易见的问题。对不起,我没有其他建议。我确实在我的模型类中使用了
NotMappedAttribute
。但这是一个明确的妥协,我问这个问题是为了避免这种情况。
Project
的setter是公共的,它仍然没有附加业务逻辑,这意味着可以从任何地方为属性赋值,而不必确保它得到正确执行。但是,在键入我最后的注释时,我想到了一个可能的解决方案。对。我确实在我的模型类中使用了
NotMappedAttribute
。但这是一个明确的妥协,我问这个问题是为了避免这种情况。
项目的setter是公共的,它仍然没有业务
private CoilProject _project;

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