与WebAPI OData v4的一对一或零关系

时间:2015-08-21 20:49:48

标签: c# entity-framework asp.net-web-api odata asp.net-web-api-odata

我正在使用Entity Framework 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 Client Code Generator模板。

WebAPI创建的元数据文件缺少用户IsNullable="False"属性的UserID属性。因此,OData客户端代码生成器使User类的UserID属性可以为空,但事实并非如此,尤其是当它是主键时。

我已尝试将[Required]添加到UserStats上的User属性,但是如果我不在User包含UserStats时,任何更新都会引发验证异常保存/更新Date.now()类。

我觉得我错过了什么。

1 个答案:

答案 0 :(得分:1)

在一对一关系中,一端必须是委托人,另一端是依赖关系。 EF要求从属实体的PK也为FK。在ForeignKey类的UserID媒体资源上添加UserStats属性:

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属性更改为可为空:

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);