我正在尝试一对一的关系,导航属性就在一边(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 one-to-one without navigator),不知道是不是一个好主意,但我无法使用流畅的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.
答案 0 :(得分:1)
修改强> 类似的SO帖子Code First and Fluent API one to one relationship
这是MS EF网站示例。 http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired
答案 1 :(得分:1)
好的,所以我复制了你的代码并试了一下,我的答案有多个部分:
建议,尝试查看配置有什么问题,并且每次更改都使用SQL Server Management Studio或任何其他工具来检查生成的数据库模式,以确保它是您希望的结果,如果您不需要配置,请不要使用它。