2

Code First CTP 5 を使用しています。親テーブルと子テーブルの間の設定はかなり単純です。

Create table testA (
    id int not null identity(1,1),
    stuff varchar(200),
    primary key (id)
    );
go

create table testB (
    id int not null
        foreign key references testA(id),
    morestuff varchar(200),
    primary key (id)
    );
go

Code First を使用してこれらのテーブルを参照するには、次の構造を使用します。

namespace Test.Models
{
    public class TestEntities : DbContext
    {
        public DbSet<testa> testa { get; set; }
        public DbSet<testb> testb { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<testa>().ToTable("testa");
            modelBuilder.Entity<testa>()
                .Property(p => p.id)
                .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);

            modelBuilder.Entity<testb>().ToTable("testb");
        }
    }


    public class testa
    {
        public int id { get; set; }
        public String stuff { get; set; }

        public virtual testb testb { get; set; }
    }

    public class testb
    {
        public int id { get; set; }
        public string morestuff { get; set; }

        public virtual testa testa { get; set; }
    }
}

testa にレコードを追加しようとすると、「IDENTITY_INSERT が OFF に設定されている場合、テーブル 'testA' の ID 列に明示的な値を挿入できません。」というエラーが表示されます。

Ok。Id が ID 列であることを認識していないため、Code First に 1 を打ちます。これを修正できるので、CodeFirst に testa.id が ID であることを伝えます。

    modelBuilder.Entity<testa>()
        .Property(p => p.id)
        .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity);

それをもう一度実行すると、別のエラーが表示されます。では、この写真のどこが悪いのでしょうか?

私は何を間違っていますか、どうすれば修正できますか???

4

1 に答える 1

3

1:1の関連付けでは、Code Firstは、エンティティの1つをプリンシパルとして認識し、もう1つを依存として認識します。次に、プリンシパルPKをIDとして作成し、依存テーブルに挿入するときに有効な一意のPKを処理する必要があります。あなたの場合、それはプリンシパルとして選択しますが、あなた はこのアソシエーションのプリンシパルエンドにtestbなりたいようです。testaこれは、流暢なAPIを使用し、基本的にどれがプリンシパルでどれが依存しているかについてCodeFirstにヒントを与えることで実現できます。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<testb>()
                .HasRequired(b => b.testa)
                .WithOptional(a => a.testb);                
}

詳細については、この記事を参照してください:
EFコードファーストCTP5の関連付け:パート2 –共有主キーの関連付け

于 2011-02-17T03:22:09.777 に答える