我有一些用于我正在尝试编写的应用程序的课程。关系是这样的:
一个用户可以有多个待办事项列表,
待办事项列表可以包含许多待办事项。
这是代码:
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; }
}
我的理由是:
待办事项需要一个链接回其所属的待办事项列表项,但它可以在待办事项列表之外创建,因此它是可为空的属性。
待办事项列表需要与其用户建立关系,并且没有用户就无法存在,因此此处不能为空。
但是,我不确定用户个人资料是否需要指向待办事项列表的链接,因为它已在待办事项列表中引用。
根据官方文档,
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
}