EF5一对一无导航
本文关键字:导航 一对一 EF5 | 更新日期: 2023-09-27 18:00:25
我正在尝试建立一对一的关系,导航属性就在一边(MVC4、EF5,代码优先)。
public class User {
public int UserId { get; set; } //PK
public int RankId { get; set; } //FK
public virtual Rank { get; set; } //Navigation
}
public class Rank {
public int RankId { get; set; }
}
配置:
public class RankConfiguration : EntityTypeConfiguration<Rank>
{
public RankConfiguration()
{
HasKey(e => e.RankId);
Property(e => e.RankId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
}
}
public class UserConfiguration : EntityTypeConfiguration<User>
{
public UserConfiguration ()
{
// PK
HasKey(e => e.UserId);
Property(e => e.RankId)
.IsRequired();
HasRequired(e => e.Rank)
.WithRequiredDependent()
.WillCascadeOnDelete(true);
}
}
就我所见(以及我所知),db是正确生成的,但我得到了这个错误:
ReferentialConstraint中的依赖属性映射到存储生成的列。列:"UserId"。
在第一次尝试中,我想创建一个连接表(参考这里的EF5 Fluent API一对一,没有导航器),不知道这是否是个好主意,但我无法使用Fluent API。
我不知道为什么和出了什么问题。。有什么帮助吗?提前感谢
更新
第一次尝试在@soadyp评论之后,我尝试用连接表配置一对一
HasRequired(e => e.Rank)
.WithRequiredDependent()
.Map(m =>
{
m.ToTable("UserRank");
m.MapKey("RankId");
})
.WillCascadeOnDelete(true);
但我在尝试迁移时遇到了这个错误:
The specified table 'UserRank' was not found in the model.
Ensure that the table name has been correctly specified.
第二次尝试看完这篇文章后,我可能把一件简单的工作做得太复杂了http://weblogs.asp.net/manavi/archive/2011/04/14/associations-in-ef-4-1-code-first-part-3-shared-primary-key-associations.aspx我只是以这种方式改变
HasRequired(e => e.Rank)
.WithOptional()
.WillCascadeOnDelete(true);
一切都很好,但UserId PK没有设置为Identity(当我插入一行时,有明显的问题)。如果我将其指定为Identity:
Property(e => e.UserId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
我得到以下错误:
Cascading foreign key 'FK_dbo.Users_dbo.Ranks_UserId' cannot be created where
the referencing column 'Users.UserID' is an identity column.
Could not create constraint. See previous errors.
好的,所以我已经复制了你的代码并尝试了它,我的答案有多个部分:
- 在您当前的配置中,生成的数据库有些混乱,请参阅Users表中的"UserId"正在变成FK(我真的不知道为什么),所以"RankId"只是变成了一个普通的整数属性(它不是键),所以我认为这就是触发您提到的关于ReferentialConstraint的第一个异常的原因,因为如果您仔细想想,数据库知道"UserId"是一个主键,同时它也是一个外键,但"UserId"引用的实际密钥(即"RankId")不是数据库生成的,所以数据库假设如何计算所有这些信息
- 现在可能有一个"正确的配置来修复这个问题,但我找不到,所以为了解决这个问题,我删除了流畅的配置,实体框架按照惯例创建了所有内容,它做得很好(它发现User类中的"RankId"实际上是一个外键)
一个建议,试着看看配置有什么问题,每次更改都要使用SQL Server Management Studio或任何其他工具,您必须检查生成的数据库架构,以确保它是您希望的,如果您不需要配置,就不要使用它。
1:1代码首先要求依赖表具有SAME主键。否则,你想做的事情就会奏效。
编辑类似SO post Code First和Fluent API一对一关系
这是MS EF站点样本。http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired