4

ここで質問する前にググってみましたが、解決策が見つかりませんでした。

これらの 2 つのクラスと、1 対多の 1 つのマッピングがあります。

新しいオブジェクトをアタッチしようとしています

    パブリック クラス MyContext : DbContext
    {
        パブリック IDbSet Operacoes { get; 設定; }
        public IDbSet Apontamentos { get; 設定; }
    }

    public class Operacao
    {
        公開文字列親孝行 { get; 設定; }
        公開文字列 Codigo { get; 設定; }
        public string Descricao { get; 設定; }
    }

    public class アポンタメント
    {
        public int ID { get; 設定; }
        公開文字列親孝行 { get; 設定; }
        公開文字列 OperacaoCodigo { get; 設定; }
        パブリック仮想 Operacao Operacao { get; 設定; }
    }

    public class OperacaoMap : EntityTypeConfiguration
    {
        public OperacaoMap()
        {
            ToTable("za6010");
            HasKey(x => new { x.Filial, x.Codigo })
                .Property(x => x.Codigo).HasColumnName("za6_cod");

            Property(x => x.Descricao).HasColumnName("za6_desc");
        }
    }



    パブリック クラス ApontamentoMap : EntityTypeConfiguration
    {
        public ApontamentoMap()
        {
            ToTable("za4010");

            HasKey(x => new { x.Fialial, x.Id });

            プロパティ(x => x.OperacaoCodigo)
                .HasColumnName("za4_oper");

            ///
            HasRequired(x => x.Operacao)
                。多くは()
                .HasForeignKey(x => new { x.Filial, x.OperacaoCodigo })
                .WillCascadeOnDelete(false);
        }
    }

    public static class プログラム
    {
        static void main()
        {
            //これは機能しません。機能させる必要があります。
            var context = new MyContext();
            var newObj = 新しいアポンタメント
            {
                フィリアル=「01」、
                OperacaoCodigo = "001"
            };
            context.Apontamentos.Attach(newObj);
            var desc = newObj.Operacao.Descricao; // ここで Operacao プロパティは null です

            //これは機能します
            var newObjTmp = 新しいアポンタメント
            {
                フィリアル=「01」、
                OperacaoCodigo = "001"
            };
            var operacao = context.Operacoes.Where(x => x.Codigo == "001");
            context.Apontamentos.Attach(newObj);
            var descTmp = newObjTmp.Operacao.Descricao; // Operacao プロパティは問題ありません。

        }
    }
4

1 に答える 1

6

エンティティが動的プロキシによってラップされておらず、ナビゲーション プロパティを遅延読み込みできないため、最初のケースは機能しません。これを試して:

var context = new MyContext();
var newObj = context.Apontamentos.Create();
newObj.Filial = "01",
nowObj.OperacaoCodigo = "001"

context.Apontamentos.Attach(newObj);
var desc = newObj.Operacao.Descricao;

現在のソリューションを引き続き使用して、プロパティを明示的に読み込むこともできます。

 var context = new MyContext();
 var newObj = new Apontamento
     {
         Filial = "01",
         OperacaoCodigo = "001"
     };
 context.Apontamentos.Attach(newObj);
 context.Entry(newObj).Reference(o => o.Operacao).Load();
 var desc = newObj.Operacao.Descricao;
于 2012-04-19T20:57:51.370 に答える