2

我正在使用 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;}
}

我还在使用带有 OData v4 的 ASP.Net WebAPI 2.2 和 OData 客户端代码生成器模板。

WebAPI 创建的元数据文件缺少IsNullable="False"用户属性的UserID属性。因此,OData 客户端代码生成器使 User 类的UserID属性可以为空,这是不正确的,尤其是在它是主键的情况下。

我已经尝试添加[Required]到 UserStats 上的属性,但是如果我在保存/更新类时User不包含 a ,那么任何更新都会引发验证异常。UserUserStats

我觉得我错过了什么。

4

1 回答 1

1

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

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

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); 
于 2015-08-21T21:33:27.380 回答