如何设置不同班级之间的FK

问题描述 投票:0回答:1

我有一些用于我正在尝试编写的应用程序的课程。关系是这样的:
一个用户可以有多个待办事项列表,
待办事项列表可以包含许多待办事项。
这是代码:

public class ToDo
{
    public Guid Id { get; set; }
    public string? Name { get; set; }
    public string? Description { get; set; }
    public bool? InProgress { get; set; }
    public bool? IsComplete { get; set; }
    public DateTime Created { get; set; } = DateTime.Now;

    public ToDoList? ToDoList { get; set; } 
    public Guid? ToDoListId{ get; set; }
}

public class ToDoList
{
    public Guid Id { get; set; }
    public string? Title { get; set; }
    public List<ToDo>? ToDos { get; set; }

    public Guid UserId { get; set; }
    public User User { get; set; }
}

public class User
{
    public Guid Id { get; set; }
    public string? Name { get; set; }
    public string? Email { get; set; }
    public string? Password { get; set; } // Be sure to properly hash and salt passwords
    public string? ProfilePhotoUrl { get; set; } 
    public List<ToDoList>? ToDoLists { get; set; } 
}

我的理由是:

待办事项需要一个链接回其所属的待办事项列表项,但它可以在待办事项列表之外创建,因此它是可为空的属性。

待办事项列表需要与其用户建立关系,并且没有用户就无法存在,因此此处不能为空。

但是,我不确定用户个人资料是否需要指向待办事项列表的链接,因为它已在待办事项列表中引用。

c# entity-framework entity-framework-core
1个回答
0
投票

根据官方文档

public List<ToDoList>? ToDoLists { get; set; }
不需要:

一对多关系由以下组成:

  • 主要实体的一个或多个主要或备用关键属性;这是关系的“一”端。例如,Blog.Id。
  • 依赖实体上的一个或多个外键属性;这就是关系的“多”端。例如,Post.BlogId。
  • (可选)引用依赖实体的主体实体上的集合导航。例如,博客.帖子。
  • (可选)引用主体实体的依赖实体上的引用导航。例如,Post.Blog。

官方文档中的代码是这样的:

// Principal (parent)
public class Blog
{
    public int Id { get; set; }
    public ICollection<Post> Posts { get; } = new List<Post>(); // Collection navigation containing dependents
}

// Dependent (child)
public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; } // Required foreign key property
    public Blog Blog { get; set; } = null!; // Required reference navigation to principal
}

注意: 不要让

// Required reference navigation to principal
注释让您感到困惑 - 它并不意味着需要引用导航属性,而是需要关系。否则,它将是可为空的引用类型,正如您在可选一对多段落中看到的那样。

所以,在你的代码中 - 请注意注释:

public class ToDo
{
    public Guid Id { get; set; }
    public string? Name { get; set; }
    public string? Description { get; set; }
    public bool? InProgress { get; set; }
    public bool? IsComplete { get; set; }
    public DateTime Created { get; set; } = DateTime.Now;

    public ToDoList? ToDoList { get; set; }  // Optional
    public Guid? ToDoListId{ get; set; } // Required
}

public class ToDoList
{
    public Guid Id { get; set; } // Required
    public string? Title { get; set; }
    public List<ToDo>? ToDos { get; set; }

    public Guid UserId { get; set; } // Required
    public User User { get; set; } // Optional
}

public class User
{
    public Guid Id { get; set; } // Required
    public string? Name { get; set; }
    public string? Email { get; set; }
    public string? Password { get; set; } // Be sure to properly hash and salt passwords
    public string? ProfilePhotoUrl { get; set; } 
    public List<ToDoList>? ToDoLists { get; set; } // Optional
}
© www.soinside.com 2019 - 2024. All rights reserved.