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;}
}

user テーブルに houseId 列がないことに注意してください。

これを正しくマッピングするにはどうすればよいですか?

注: 以下の方法は、House モデルのナビゲーション プロパティを User にも追加する必要があるため、私が本当にやりたいことではありません。

この方法を試してみましたが、やりたくないハウス モデルに仮想プロパティを追加する必要がありました: How do I code a optional one-to-one relationship in EF 4.1 code first with lazy loading and the same primary両方のテーブルのキー?

したがって、私の構成は上記の試行で次のようになります。

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 エンティティはデータベースに問題なく保存され、ID は正しく設定されます。

4

2 に答える 2

1

UserIdからプロパティを削除し、コンストラクターからマッピングをHouse削除して、で使用します。this.HasRequired...HouseConfigurationUserConfiguration

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

これにより、共有主キーの関連付けが定義されます (つまりHouse.Id、主キーHouseと外部キーがUser同時に存在します)。

user_idテーブルに個別の外部キー列を持つ既存のデータベースがありHouse、この列に一意のキー制約があり、データベースで 1 対 1 の関係を強制する場合、これを Entity Framework との 1 対 1 の関係としてマップすることはできません。 EF は、外部キーの 1 対 1 の関連付けをサポートしていません。

この場合、これを一対多の関係としてマッピングする必要がありますが、残念ながらHouse、プリンシパルで単一の参照を持つことはできませんUser。代わりに es のコレクションを使用する必要がありますHouse(ビジネス ロジックでは、このコレクションに複数の要素を追加しないようにしてください。そうしないと、保存時に、Houseテーブル内の一意の FK 制約の違反により例外が発生します) 。にはナビゲーション プロパティがまったくありませんUserUserただし、EF がリレーションシップをマップできるようにするには、エンティティにナビゲーション参照が必要ですHouse(少なくとも、リレーションシップの一方の側のナビゲーション プロパティが常に必要です)。

于 2013-05-15T16:46:21.330 に答える
0

EF4 にロールバックすることはできませんが、少し前に同様の方法で使用しただけなので、これが変更されたとは思わないでください。

House オブジェクトに Key を設定し、それを DB generated に設定する必要があります。

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 に答える