当我在启用了延迟加载的虚拟外键导航属性上使用自定义集访问器时,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属性名称之间存在冲突。
当应用于导航属性时,ForeignKey
attribute指定FK属性名称。如果不存在这样的属性,EF Core将使用该名称创建阴影属性。
使用自动属性,后备字段名称由编译器生成,而不是 "project"
,因此没有问题。但是在第二种情况下,已经有一个名为的字段"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 */ }
}
和
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] 删除。
我来说两句