1

我首先使用实体​​框架 4、mvc4 和代码。

我正在努力创建一个选项 1:1 映射,其中具有可选 1:1 映射的主要实体中没有 FK:

public class User
{
   [Column("user_id")]
   public int Id {get;set;}

   public virtual House House {get;set;}  // optional mapping
}

public class House
{
   [Column("house_id")]
   public int Id {get;set;}

   [Column("user_id")]
   public int UserId {get;set;}
}

请注意用户表如何没有 houseId 列。

我怎样才能正确映射它?

注意:下面的方法不是我真正想做的,因为它迫使我在 House 模型上添加导航属性也返回给 User。

我尝试了这种方法,尽管我不得不向 House 模型添加一个我不想这样做的虚拟属性:如何首先在 EF 4.1 代码中使用延迟加载和相同的主代码编写可选的一对一关系两张桌子上的钥匙?

所以我的配置看起来像上面的尝试:

public class UserConfiguration : EntityTypeConfiguration<User>
        {
            public UserConfiguration()
            {
                this.ToTable("User", SchemaName);
                this.HasKey(x => x.Id);
                this.HasOptional(x => x.House);
            }
        }

    public class HouseConfiguration : EntityTypeConfiguration<House>
    {
        public HouseConfiguration()
        {
            this.ToTable("House", SchemaName);
            this.HasKey(x => x.Id);
            this.HasRequired(vc => vc.User).WithRequiredDependent(v => v.House);
        }
    }

但是当我这样做时,保存模型我得到这个错误:

Cannot insert explicit value for identity column in table 'House' when IDENTITY_INSERT is set to OFF

注意:如果没有上述设置(映射和配置),House 实体会很好地保存到数据库中,并且身份设置正确。

4

2 回答 2

1

从 中删除UserId属性,从构造函数中House删除this.HasRequired...映射并在 中使用:HouseConfigurationUserConfiguration

this.HasOptional(x => x.House).WithRequired();

这将定义一个共享的主键关联(即House.Id同时是主键House和外键User)。

user_id如果您有一个现有数据库在表中具有单独的外键列,House并且该列具有唯一键约束以在数据库中强制执行一对一关系,则您无法将其映射为与实体框架的一对一关系,因为EF 不支持外键一对一关联。

在这种情况下,您必须将其映射为一对多关系,不幸的是,您不能House对 principal有单一引用User。您将不得不使用Housees 的集合(并确保在业务逻辑中您永远不会向此集合添加多个元素,否则在保存时您会由于违反House表中的唯一 FK 约束而获得异常)或中根本没有导航属性User。但是随后您需要User实体中的导航引用,House以便 EF 能够映射关系(至少始终需要关系一侧的导航属性)。

于 2013-05-15T16:46:21.330 回答
0

无法回滚到 EF4,但只是在不久前以类似的方式使用它,所以不要相信这已经改变了。

您需要在 House 对象上设置一个 Key 并将其设置为 DB 生成:

using System.ComponentModel.DataAnnotations.Schema
using System.ComponentModel.DataAnnotations
...

public class House
{
        [Column("house_id")]
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int Id { get; set; }

        [Column("user_id")]
        public int UserId { get; set; }
}
于 2013-05-15T16:27:12.967 回答