与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,则任何更新都会抛出验证异常。

与WebAPI OData v4的1到0或1的关系

在一对一的关系中,一端必须是主体,另一端是从属。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);