与WebAPI OData v4的1到0或1的关系
本文关键字:关系 WebAPI v4 OData | 更新日期: 2023-09-27 18:09:05
我使用实体框架4.3和做代码第一。我有两个表是1到0或1的关系,如…
class User
{
[key]
public int UserID {get; set;}
// other props
}
class UserStats
{
[key]
public int UserID {get; set;}
// other props
public virtual User User {get; set;}
}
我也在使用ASP。. Net WebAPI 2.2 w/OData v4和OData客户端代码生成器模板。
WebAPI创建的元数据文件在用户的UserID
属性上缺少IsNullable="False"
属性。因此,OData客户端代码生成器使用户类的UserID
属性为空,这是不正确的,特别是它是主键。
我已经尝试将[Required]
添加到UserStats上的User
属性,但是,如果我在保存/更新UserStats
类时不包括User
,则任何更新都会抛出验证异常。
在一对一的关系中,一端必须是主体,另一端是从属。EF要求依赖实体的PK
也是FK
。在UserStats
类的UserID
属性上添加ForeignKey
属性:
public class User
{
[Key]
public int UserID {get; set;}
// other props
}
public class UserStats
{
[Key, ForeignKey("User")]
public int UserID {get; set;}
// other props
public virtual User User {get; set;}
}
如果你想要User
导航。属性是可选的,那么你将需要改变一些你的模型。首先,您需要向UserStats
实体添加一个新的PK属性,并将UserID
FK属性更改为nullable:
public class User
{
[Key]
public int UserID {get; set;}
// other props
}
public class UserStats
{
[Key]
public int UserStatsID {get; set;}
[ForeignKey("User")]
public int? UserId {get;set;}
// other props
public virtual User User {get; set;}
}
但是要小心,这最后一个不是一对一的关系,实际上是一对多的关系,但是很多人用它来求婚。如果您使用Fluent Api配置最后一个关系,它将是这样的:
modelBuilder.Entity<UserStats>().HasOptional(us=>us.User).WithMany().HasForeignKey(us=>us.UserId);