Is it possible in EF Core to make a one-way navigation property required?(在EF Core中是否可以使单向导航属性成为必需的?)
问题描述
我正在开发一个基本的群聊系统,我为它创建了以下类:
public class Role
{
public Guid Id { get; set; };
public string Username { get; set; }
}
public class Message
{
public Guid Id { get; set; };
public Role Author { get; set; }
public Conversation Conversation { get; set; }
public DateTime Date { get; set; }
public string Text { get; set; }
}
public class Conversation
{
public Guid Id { get; set; };
public IList<ConversationParticipant> ConversationParticipants { get; set; };
public IList<Message> Messages { get; set; };
}
public class ConversationParticipant
{
public Conversation Conversation { get; set; }
public Role Role { get; set; }
}
我们正在将EF Core 3.1 Code-First用于迁移。
我正在寻找一种方法使Message.Author
成为必需的属性,这将导致表Message
中的一个列被创建为AuthorId NOT NULL
。
我已尝试:
public static void Map(this EntityTypeBuilder<Message> builder)
{
builder.HasOne(m => m.Author);
}
由于这是使用添加-迁移和更新-数据库应用的,因此创建了数据库列AuthorId
,但允许NULL
。
似乎没有方法IsRequired()
可以添加到HasOne()
之后。
我也试过了:
public static void Map(this EntityTypeBuilder<Message> builder)
{
builder.Property(m => m.Author).IsRequired();
}
但这并不能说明
属性‘Message.Author’的类型为‘Role’,当前数据库提供程序不支持该类型。更改属性CLR类型或使用‘[NotMaps]’特性或通过使用‘OnModelCreating’中的‘EntityTypeBuilder.Ignore’忽略该属性。
先执行.HasOne(...)
再执行.Property(...).IsRequired()
也不起作用:
"Author"不能用作实体类型"Message"的属性,因为它被配置为导航。
我设法使Message.Conversation
成为必需的:
public static void Map(this EntityTypeBuilder<Conversation> builder)
{
builder.HasMany(c => c.Messages) // A conversation can have many messages
.WithOne(e => e.Conversation) // Each message belongs to at most 1 conversation
.IsRequired(); // A message always has a conversation
}
但是,我不想让Role
知道消息,因为我永远不想直接从角色检索消息(这将通过对话和参与者进行)。
我的最终问题是:有没有一种方法可以使Message.Author
成为必需的(非空),而不使用Role
中的Messages属性将Message
和Role
链接在一起形成完全的一对多关系?
推荐答案
如何将Role
的外键添加到Message
,然后要求该属性不为空?类似于:
// MessageConfiguration.cs
builder.Property(b => b.RoleId).IsRequired()
这篇关于在EF Core中是否可以使单向导航属性成为必需的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在EF Core中是否可以使单向导航属性成为必需的?
基础教程推荐
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- c# Math.Sqrt 实现 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- rabbitmq 的 REST API 2022-01-01