我有三个MySQL表,它们似乎都是使用.Net Core 2.2正确生成的。 首先使用 Pomelo/EF 框架编写代码:
-
具有 PK=UserId 的 AspnetUsers (具有 Id 的默认"标识用户"表 更改为用户 ID)
-
使用 PK=用户标识进行用户设置
我最初在上一个项目中将它们作为一个 User 表,并希望尽可能多地保留 Identity,因此我创建了第二个表来保存其他用户设置。
问题存在于我的第三个表上,称为"当前与此 FK 关系的事件":
public class Incident
{
[Key]
public int IncidentId { get; set; }
...
public string UserId { get; set; }
...
[ForeignKey("UserId")]
public virtual IdentityUser User { get; set; }
[ForeignKey("UserId")]
public virtual UserSetting UserSetting { get; set; }
}
因此,理想情况下,我将能够从 AspnetUsers 表和 UserSet 表中提取值以形成一个完整的用户。但是,在尝试执行此操作时:
IQueryable<Incident> incident = _context.Incident.OrderByDescending(d => d.IncidentDate);
然后获得以下任一方法:
incident.User (e.g. incident.User.Username)
incident.UserSetting (e.g. incident.UserSetting.IPAddress)
我得到一个NullReferenceException
.我认为EF很困惑,或者也许我是...但是当我删除注释并让 EF 尝试对其进行排序时,我在运行添加迁移时收到以下错误消息:
"Incident.User"和"IdentityUser"之间的关系以及 在"Incident.UserSetting"和"UserSetting"之间可以使用{'UserId'} 作为外键。要解决此问题,请配置外键 至少一个关系上的显式属性
我尝试了几件事,但没有比这更明智的了。我肯定已经检查了 UserId 值在所有三个表中是否匹配(因此它不为空,因为它实际上是空的)。当我查看调试器输出时,我没有看到在 select 语句上完成任何连接。
我想过在UserSet和AspnetUsers表之间创建一个FK关系(例如incident.User.Usersetting.IPAddress
),但同样,试图摆脱身份的调整,这种调整似乎在没有脚手架的情况下几乎是看不见的。
如何使用事件表中的一个 UserId 属性将两个用户表链接到事件表?这可能是一个坏主意(即我应该回到使用单个用户表吗)?谢谢。
菜鸟错误...我正在将一个四年前的项目从.NET Framework转换为.NET Core。.NET Framework 不需要.Include()
语句。所以,我只是改变了:
IQueryable<Incident> incident = _context.Incident.OrderByDescending(d => d.IncidentDate);
自:
var incident = _context.Incident
.Include(u => u.User)
.Include(u => u.UserSetting)
.OrderByDescending(d => d.IncidentDate);