EntityFrameworkCore:如何将具有外键的实体保存到另一个模型?

abo*_*nov 0 c# entity-framework-core asp.net-core-mvc asp.net-core asp.net-core-webapi

我有一个与另一个相关的模型:

public class Portfolio : BaseEntity, IEntityBase
    {
        public string Name { get; set; }
        public Org Organization { get; set; }
        public bool IsPrivate { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

当我尝试保存它(将字段的值organization指向数据库中的现有记录)时,ModelState 无效(“组织”:输入无效)。

我将 的idOrganization其余的有效负载一起发送:

{
    "Name": "Port 1",
    "Organization": 16
}
Run Code Online (Sandbox Code Playgroud)

控制器代码非常简单:

[HttpPost]
public IActionResult Create([FromBody]Portfolio item){
     if (ModelState.IsValid){
         _PortfolioRepo.Add(item);
         _PortfolioRepo.Commit();
         return new OkObjectResult(item);
         }
     else{
        return BadRequest(ModelState);
     }
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我Organization在有效负载中指定字段时,item方法中的字段Create()将出现null,因此我无法Organization从其存储库中手动检索并链接到Portfolio其中任何一个字段。当我省略 时Organization,它会很好地保存实体。

如果我将有效负载的详细信息包含Organization在内部,那么 EF 将在数据库中保存新的组织记录。但是,如何链接到现有模型而不是保存新模型呢?

Cod*_*shi 6

在你的Portfolio模型中你有这个属性:

public Org Organization { get; set; }
Run Code Online (Sandbox Code Playgroud)

请注意,该房产的类型是Org。因此,由于显而易见的原因,将其设置为数字将不起作用。尝试将您的模型稍微更改为如下所示:

public int OrganizationId { get; set; }

[ForeignKey("OrganizationId")]
public Org Organization { get; set; }
Run Code Online (Sandbox Code Playgroud)

这将告诉 EF 该Organization属性是导航属性,其外键是OrganizationId。设置OrganizationId属性,它应该可以工作。