【问题标题】:EF5 one-to-one without navigationEF5一对一无导航
【发布时间】:2013-02-21 07:51:46
【问题描述】:

我正在尝试建立一对一的关系,导航属性仅在一侧(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 Fluent API one-to-one without navigator),不知道是否是个好主意,但我无法使用流畅的 API。

我不知道为什么以及出了什么问题..有什么帮助吗?非常感谢提前

更新

第一次尝试@soadyp评论后,我尝试配置一个与join table的一对一

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 没有设置为身份(当我插入一行时有明显的问题)。如果我将其指定为身份:

  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.

【问题讨论】:

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


    【解决方案1】:

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

    1. 在您当前的配置下,生成的数据库有些混乱,请参阅用户表中的“UserId”正在变成 FK(我不知道为什么)所以“RankId”只是变成了一个普通的整数属性(它不是键),所以我认为这是触发您提到的关于引用约束的第一个异常,因为如果您考虑一下,数据库知道“UserId”是主键,同时它是外键,但“UserId”引用的实际键(即“RankId”)不是数据库生成的,所以数据库应该如何计算所有这些信息。
    2. 现在可能有一个“正确的配置来解决这个问题,但我找不到,所以为了解决这个问题,我删除了流畅的配置,实体框架按照惯例创建了所有内容,它做得很好(它发现“RankId " 在 User 类中实际上是一个外键)。

    建议,尝试查看配置有什么问题,并且每次更改都使用 SQL Server Management Studio 或任何其他工具,您必须检查生成的数据库架构以确保它是您希望的,另外,如果您不需要配置,请不要使用它。

    【讨论】:

    • 似乎 EF 比我更聪明.. 保留默认行为会导致问题.. 我会尝试调查原因,目前尚不清楚原因,但现在它可以工作了。谢谢!!
    【解决方案2】:

    EF 中的 1:1 代码优先要求依赖表具有相同的主键。 否则你想做的事情会奏效。

    编辑 类似的SO帖子Code First and Fluent API one to one relationship

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

    【讨论】:

    • 我明白了.. 我不能使用相同的主键怎么办?在这种情况下,我认为连接表是我唯一的解决方案.. 可能吗?
    • 我的意思是:我将有不同的等级来存储(用户、照片、视频等)..我可以为每种类型创建一个表,当然,如果是更好的设计,但是我在想只有一张表来存储所有类型的排名(但无论如何我想避免在排名上进行导航)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2012-11-01
    • 1970-01-01
    • 2014-03-18
    • 2014-03-14
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多