【发布时间】:2016-07-30 05:27:32
【问题描述】:
我目前正在清理一个相当大的数据库。部分数据库具有一对零或一映射的关系。具体来说:
User -> UserSettings
并非所有用户都有用户设置,但没有用户就不能存在用户设置。不幸的是,这些表已经存在。 User 有一个 PK ID。 UserSettings 有一个 PK ID 和一个列 User_Id_Fk,此时它不是真正的 FK(没有定义关系)。
我正在修复这个问题,并且已经通过 SQL 从数据库的角度进行了修复,并通过测试进行了确认。 (添加了 FK 约束。在 User_Id_Fk 上添加了唯一约束。)这一切都是在 UserSettings 表上完成的。 (注意:我这里没有使用EF Migrations,此时我必须手动编写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; }
}
我真的没有这个选项,因为数据库正在用于我目前无法控制的其他应用程序。那么,我被困在这里了吗?我是否只需要维护一个 1:many 映射(现在可能发生,尽管它还没有)并且没有适当的 1:0..1 映射约束?
更新
看看下面 octavioccl 的答案,我尝试了一下,但没有成功。但是,我随后从UserSettings 的映射中删除了User(但我离开了UserId)。据我所知,一切似乎都有效。然而,我真的很困惑这里发生了什么,如果这甚至是正确的答案,或者我只是走运。
【问题讨论】:
标签: c# sql-server entity-framework asp.net-core entity-framework-core