EF5一对一无导航

时间:2013-02-21 07:51:46

标签: c# entity-framework ef-code-first entity-framework-5 one-to-one

我正在尝试一对一的关系,导航属性就在一边(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.

2 个答案:

答案 0 :(得分:1)

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

修改 类似的SO帖子Code First and Fluent API one to one relationship

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

答案 1 :(得分:1)

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

  1. 使用您当前的配置,生成的数据库搞砸了一些如何,在Users表中看到“UserId”正在成为FK(我不知道为什么会这样)所以“RankId”只是成为一个普通的整数属性(它不是键),所以我认为这是触发你提到的关于ReferentialConstraint的第一个异常的原因,因为如果你考虑它,数据库知道“UserId”是一个主键,同时它是一个外键但“UserId”引用的实际键“RankId”不是数据库生成的,因此数据库如何计算出所有这些信息。
  2. 现在可能有一个“正确的配置来修复这个但我找不到,所以为了解决这个问题,我删除了流畅的配置,实体框架按照惯例创建了所有内容,它做得很好(它想出了”RankId “在User类中实际上是一个外键。”
  3. 建议,尝试查看配置有什么问题,并且每次更改都使用SQL Server Management Studio或任何其他工具来检查生成的数据库模式,以确保它是您希望的结果,如果您不需要配置,请不要使用它。