EF5一对一无导航

我正在尝试一对一的关系,导航属性就在一边(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 { public RankConfiguration() { HasKey(e => e.RankId); Property(e => e.RankId) .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); } } public class UserConfiguration : EntityTypeConfiguration { 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一对一,没有导航器 ),不知道是不是一个好主意,但我无法使用流畅的API。

我不知道为什么和出了什么问题..有什么帮助吗? 提前谢谢了

UPDATE

首先尝试在@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. 

好的,所以我复制了你的代码并尝试了它,我的答案有多个部分:

  1. 使用您当前的配置生成的数据库搞砸了一些如何,在Users表中看到“UserId”正在成为FK(我不知道为什么会这样)所以“RankId”只是成为一个普通的整数属性(它不是一个键),所以我认为这是触发你提到的关于ReferentialConstraint的第一个exception的原因,因为如果你考虑它,数据库知道“UserId”是一个主键,同时它是一个外键但是“UserId”引用的实际键“RankId”不是数据库生成的,因此数据库如何计算出所有这些信息。
  2. 现在可能有一个“正确的配置来解决这个问题,但我找不到,所以为了解决这个问题,我删除了流畅的配置,entity framework按照惯例创建了所有内容,并且做得很好(它想出了”RankId“中的用户类实际上是一个外键)。

一个建议,试着看看配置有什么问题,并且你做的每一个更改都使用SQL Server Management Studio或任何其他工具来检查生成的数据库模式,以确保它是你想要的,加上你是否不需要配置只是不要使用它。

EF中首先使用1:1代码要求从属表具有SAME主键。 否则你想做的就行了。

编辑类似的SO post Code First和Fluent API一对一的关系

这是MS EF网站样本。 http://msdn.microsoft.com/en-us/data/jj591620#RequiredToRequired