Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 我可以使用Fluent API在特定的一对多关系中转换主键的值吗?_Asp.net Core_.net Core_Entity Framework Core_Ef Fluent Api - Fatal编程技术网

Asp.net core 我可以使用Fluent API在特定的一对多关系中转换主键的值吗?

Asp.net core 我可以使用Fluent API在特定的一对多关系中转换主键的值吗?,asp.net-core,.net-core,entity-framework-core,ef-fluent-api,Asp.net Core,.net Core,Entity Framework Core,Ef Fluent Api,我试图在EF Core 2.2中手动构建现有数据库模式的一部分。所讨论的数据库是第三方ERP软件的一部分,我对数据库本身的设计没有任何控制权,因此我正在尝试使用我得到的。到目前为止一切正常,但是我遇到了一个障碍,因为ERP供应商选择了一个有问题的数据库设计 考虑以下我试图在DbContext中的OnModelCreating()方法中构建的一对多关系(通过Fluent API): modelBuilder.Entity(s=>{ s、 HasMany(e=>e.WorkOrders) .With

我试图在EF Core 2.2中手动构建现有数据库模式的一部分。所讨论的数据库是第三方ERP软件的一部分,我对数据库本身的设计没有任何控制权,因此我正在尝试使用我得到的。到目前为止一切正常,但是我遇到了一个障碍,因为ERP供应商选择了一个有问题的数据库设计

考虑以下我试图在DbContext中的OnModelCreating()方法中构建的一对多关系(通过Fluent API):

modelBuilder.Entity(s=>{
s、 HasMany(e=>e.WorkOrders)
.WithOne()
.HasPrincipalKey(e=>e.SalesOrderNumber)
.HasForeignKey(e=>e.RelatedPO_SONumber);
});
这几乎就是我所需要的,然而,在WorkOrders表中,“RelatedPO_SONumber”是字符串类型,其中SalesOrderHeaders表中的“SalesOrderNumber”是int类型。此外,“RelatedPO_SONumber”中存储的是“SalesOrderNumber”的0填充字符串(总是8个字符长)(例如SalesOrderHeader.SalesOrderNumber=1234567,WorkOrder.RelatedPO_SONumber=“01234567”)

以下是我尝试的内容,可能有助于说明我试图通过格式说明符(抛出ArgumentException“表达式应表示简单的属性访问:'t=>t.MyProperty'”)执行的操作:

modelBuilder.Entity(s=>{
s、 HasMany(e=>e.WorkOrders)
.WithOne()
.HasPrincipalKey(e=>e.SalesOrderNumber.ToString(“D8”))
.HasForeignKey(e=>e.RelatedPO_SONumber);
});
我尝试了另一种方法,即在SalesOrderHeader实体定义中创建另一个属性,并将其用作HasPrincipalKey()的参数:

//在SalesOrderHeader中
[未映射]
公共字符串ZeroPaddedSONumber=>SalesOrderNumber.ToString(“D8”);
//在DbContext OnModelCreating()中
modelBuilder.Entity(s=>{
s、 HasMany(e=>e.WorkOrders)
.WithOne()
.HasPrincipalKey(e=>e.ZeroPaddedsOnNumber)
.HasForeignKey(e=>e.RelatedPO_SONumber);
});
这导致:

“InvalidOperationException:找不到实体类型为“SalesOrderHeader”的属性“ZeroPaddedsNumber”的支持字段,并且该属性没有setter。”

除了严格的属性引用之外,还有什么方法可以传递该属性的转换“版本”吗

提前谢谢

编辑:根据评论中的建议,我尝试了以下方法:

modelBuilder.Entity(s=>{
s、 属性(e=>e.SalesOrderNumber)
.HasConversion(n=>n.ToString(“D8”),s=>int.Parse(s));
s、 HasMany(e=>e.WorkOrders)
.WithOne()
.HasPrincipalKey(e=>e.SalesOrderNumber)
.HasForeignKey(e=>e.RelatedPO_SONumber);
});
这似乎也不起作用,我得到以下异常(如果省略转换,我会得到相同的异常):

为实体类型“WorkOrderHeader”上的外键{'RelatedPO_SONumber'}指定的属性类型与实体类型“SalesOrderHeader”上的主键{'SalesOrderNumber'}中的属性类型不匹配


您是否尝试过
NumberToStringConverter
?@crgolden我不知道它的存在,但它看起来可能会起作用?我会尝试一下,但一看它似乎每次都会进行转换。这对我不起作用,因为还有其他表依赖SalesOrderNumber的int值来建立它们的关系.如果我能把它付诸实施,我会把它作为一个答案发布(如果没有人比我更了解它的话)。无论如何,谢谢。您是否尝试过
NumberToStringConverter
?@crgolden我不知道它的存在,但它看起来可能会工作?我将尝试一下,但一看它似乎每次都可能进行转换。这对我不起作用,因为还有其他表依赖SalesOrderNumber f的int值或者他们的关系。如果我能让这个工作,我会把它作为一个答案发布(如果没有人比我更了解它)。无论如何,谢谢。