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.

EF5一对一无导航

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

  1. 在您当前的配置中,生成的数据库有些混乱,请参阅Users表中的"UserId"正在变成FK(我真的不知道为什么),所以"RankId"只是变成了一个普通的整数属性(它不是键),所以我认为这就是触发您提到的关于ReferentialConstraint的第一个异常的原因,因为如果您仔细想想,数据库知道"UserId"是一个主键,同时它也是一个外键,但"UserId"引用的实际密钥(即"RankId")不是数据库生成的,所以数据库假设如何计算所有这些信息
  2. 现在可能有一个"正确的配置来修复这个问题,但我找不到,所以为了解决这个问题,我删除了流畅的配置,实体框架按照惯例创建了所有内容,它做得很好(它发现User类中的"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