【问题标题】:One to Zero or to One relationship with WebAPI OData v4与 WebAPI OData v4 的一对零或一对一关系
【发布时间】:2015-11-15 21:56:03
【问题描述】:

我正在使用 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 和 OData 客户端代码生成器模板的 ASP.Net WebAPI 2.2。

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

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

我觉得我错过了什么。

【问题讨论】:

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


    【解决方案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 属性更改为可为空:

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

    【讨论】:

    • 问题不在于建立一对零或一关系,我已经让实体框架处理了一段时间。问题围绕着这样一个事实,无论出于何种原因,Entity Framework 决定 UserStats 上的 UserID 属性(请注意,它有一个 UserID 的 PK)应该被视为可为空,因为 User 属性没有 [Required]。跨度>
    • 这很奇怪,因为UserID 属性不可为空并且也是PK,无论如何你应该在该属性上添加ForeignKey 数据注释(检查此link
    • 是的,ForeignKey 属性绝对是必需的。我真的只是希望我知道为什么 EntityFramework 决定 UserID 属性是可选的,尽管它是主键。
    猜你喜欢
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多