首页 / C# / c# – 使用EF7映射一对一或一
c# – 使用EF7映射一对一或一
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用EF7映射一对一或一,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2871字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用EF7映射一对一或一](/upload/InfoBanner/zyjiaocheng/796/e74f5167eca44570b64fb16fb953d641.jpg)
我目前正在清理一个相当大的数据库.数据库的一部分具有一对一或零映射的关系.特别:
User -> UserSettings
并非所有用户都有用户设置,但没有用户就不能存在用户设置.不幸的是,这些表已经存在.用户有PK ID. UserSettings有一个PK ID和一个列User_Id_Fk,此时,它不是真正的FK(没有定义关系).
我正在修复它,并且已经通过SQL从数据库角度完成了这一过程,并通过测试确认. (添加了FK约束.在User_Id_Fk上添加了一个唯一约束.)这一切都在UserSettings表上完成. (注意:我这里没有使用EF迁移.我必须在此时手动编写SQL.)
但是,我现在需要连接现有的应用程序以正确处理这个新的映射.该应用程序使用ASP.NET Core 1.0和EF7.以下是现有数据模型的(缩短版).
public class User
{
public int Id { get; set; }
public virtual UserSettings UserSettings { get; set; }
}
public class UserSettings
{
public int Id { get; set; }
[Column("User_Id_Fk")]
public int UserId { get; set; }
[ForeignKey("UserId")]
public virtual User User { get; set; }
}
我也有这个Fluent Mapping:
builder.Entity<UserSettings>()
.HasOne(us => us.User)
.WithOne(u => u.User)
.IsRequired(false);
当我去运行应用程序并访问数据库中的这些项目时,我收到此错误,然后是一组含有一些信息,这些消息没有直接与我的应用程序相关的信息:
ArgumentNullException: Value cannot be null.
Parameter name: navigation
Microsoft.Data.Entity.Utilities.Check.NotNull[T] (Microsoft.Data.Entity.Utilities.T value, System.String parameterName) <0x10d28a650 + 0x00081> in <filename unknown>, line 0
经过研究,有人提到UserSettings类的ID必须与外键相同,如下所示:
public class UserSettings
{
[Key, ForeignKey("User")]
public int Id { get; set; }
public virtual User User { get; set; }
}
我真的没有这个选项,因为DB正用于我此时无法控制的其他应用程序.那么,我被困在这里了吗?我是否只需要保持1:多的映射(现在可能会发生,虽然它没有)并且没有适当的1:0..1映射约束?
更新
看下面的octavioccl的答案,我尝试了没有任何成功.但是,然后我从UserSettings中的映射中删除了User(但我离开了UserId).就我所知,一切似乎都有效.我真的很困惑这里发生了什么,如果这是正确的答案,或者我只是幸运.
解决方法:
删除数据注释并尝试使用以下配置:
builder.Entity<UserSettings>()
.Property(b => b.UserId)
.HasColumnName("User_Id_Fk");
builder.Entity<User>()
.HasOne(us => us.UserSettings)
.WithOne(u => u.User)
.HasForeignKey<UserSettings>(b => b.UserId);
When configuring the foreign key you need to specify the dependent
entity type – notice the generic parameter provided toHasForeignKey
in the listing above. In a one-to-many relationship it is clear that
the entity with the reference navigation is the dependent and the one
with the collection is the principal. But this is not so in a
one-to-one relationship – hence the need to explicitly define it.
quoted link(Blog-BlogImage)中显示的示例与您要实现的内容几乎相同.
如果我上面显示的解决方案不起作用,那么您应该检查User_Id_Fk列是否允许null.如果是这种情况,请将FK属性类型更改为int?:
public class UserSettings
{
public int Id { get; set; }
public int? UserId { get; set; }
public virtual User User { get; set; }
}
内容总结
以上是互联网集市为您收集整理的c# – 使用EF7映射一对一或一全部内容,希望文章能够帮你解决c# – 使用EF7映射一对一或一所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。