EF5一到一个没有导航(EF5 one-to-one without navigation)

2019-08-17 02:30发布

我试图做一个一比一的关系,与导航属性只是在一边(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从属属性被映射到一个存储生成的列。 列:“用户ID”。

在第一次尝试,我想创建一个连接表(参见这里EF5流利的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-部分-3-共享主密钥-associations.aspx我只是以这种方式改变

  HasRequired(e => e.Rank)
    .WithOptional()
    .WillCascadeOnDelete(true);

一切都很好,但(当我插入一排明显problmes)的用户标识PK没有设置好的作为标识。 如果我将它指定为身份:

  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.

Answer 1:

好了,我抄你的代码,并尝试过了,我的回答有多个部分:

  1. 根据您当前的配置生成的数据库被弄乱了一些如何,看在用户表中的“用户ID”正在成为FK(我不知道为什么真的),所以“RankId”只是成为一个正常的整数属性(它不是一个关键的),所以我觉得这个是什么触发你提到的ReferentialConstraint的第一个例外,因为如果你想想看,数据库知道“用户ID”是一个主键,并在同一时间,它是一个外键,但由“用户ID”,这是“RankId”中引用的实际密钥是不产生这样的数据库是怎么想弄清楚这一切信息的数据库。
  2. 现在有可能是在“正确的配置来解决这个问题,但我找不到,所以要解决这个问题我删除了一口流利的配置和Entity Framework按照惯例,创造了万物,它的表现非常出色(它想通了,‘RankId’ User类实际上是一个外键)。

一个忠告,试着看看有什么错误的配置,并与每一个变化,你使用SQL Server Management Studio或任何其他工具,你必须检查出生成的数据库架构,以确保它是你希望它是,再加上如果您不需要配置只是不使用它。



Answer 2:

1:1的第一代码在EF要求相关表具有相同的主键。 否则,你想要做的工作会是什么。

编辑相似的,所以张贴代码第一次和流利的API一对一的关系

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



文章来源: EF5 one-to-one without navigation