1

私は Java の男で、.Net 領域の学習に取り組んでいます。私が学んでいることの 1 つは EF4 で、この興味深いことに気付きました。別のエンティティと 1:n の関係を持つエンティティを宣言するときは、次のようにする必要があります。

public int CategoryId { get; set; }
public virtual Category Category { get; set; }

私の質問は:

フレームワークが両方の宣言を必要とする正当な理由はありますか?

Java の世界では、フレームワークは、エンティティ クラスに別のフィールドを持たなくても、主キーが何であるかを把握し、そのレコードを DB に追加するほどスマートです。なぜ .Net は、この小さな、しかし厄介な問題に追随しなかったのでしょうか?

4

2 に答える 2

1

あなたはそれをする必要はありません。実際、オブジェクトを一貫性のない状態のままにしておくことができるので、そうすべきではありません。あなたが持っているとしましょう:

public class Category {
    public Int32 Id { get; set; }
}

public class SomeClass {
    public Int32 Id { get; set; }
    public virtual Category Category { get; set; }
}

これは有効です。外部キーを見つける方法を構成でEFに指示する必要があります。上記に基づいて、を使用しようとしますSomeClass.Category_Idが、好きなように変更できます。

編集:外部キーを変更したい場合は、構成クラスを追加し、OnModelCreatingイベント中に追加することで変更できます。

internal class ForSomeClassEntities : EntityTypeConfiguration<SomeClass> {
    public ForSomeClassEntities(String schemaName) {
        this.HasRequired(e => e.Category)
            .WithMany()
            .Map(map => map.MapKey("CategoryId"));
        this.ToTable("SomeClass", schemaName);
    }
}

オーバーライドされContextたクラス:

protected override void OnModelCreating(DbModelBuilder modelBuilder) {
    base.OnModelCreating(modelBuilder);

    modelBuilder.Configurations
        .Add(new ForSomeClassEntities("SomeSchema"))
        ;
}

上記と同じクラスを使用すると、EFはSomeClass.CategoryId代わりに呼び出される外部キープロパティを探すようになります。

于 2012-08-08T13:56:37.043 に答える