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中是否可以使单向导航属性成为必需的?
基础教程推荐
- 在 VB6 或经典 ASP 中使用 .NET 2022-01-01
- 将数据集转换为列表 2022-01-01
- 从 C# 控制相机设备 2022-01-01
- C# 9 新特性——record的相关总结 2023-04-03
- 重新排序 WPF TabControl 中的选项卡 2022-01-01
- 如果条件可以为空 2022-01-01
- 更新 Visual Studio 中的 DataSet 结构以匹配新的 SQL 数据库结构 2022-01-01
- SonarQube C# 分析失败“不是指针的有效行偏移" 2022-01-01
- Mono https webrequest 失败并显示“身份验证或解密失败" 2022-01-01
- 获取C#保存对话框的文件路径 2022-01-01
