2012-04-19 9 views
3

私はここで質問する前にgoogleを試みましたが、解決策を見つけることができませんでした。オブジェクトが添付された後にプロパティを読み込む

私はこれらの2つのクラスを持っているし、あなたの実体ではないので、単一のマッピング、一対多

- 私は、新しいオブジェクトあなたの最初のケースは動作しません

 
    public class MyContext : DbContext 
    { 
     public IDbSet Operacoes { get; set; } 
     public IDbSet Apontamentos { get; set; } 
    } 

    public class Operacao 
    { 
     public string Filial { get; set; } 
     public string Codigo { get; set; } 
     public string Descricao { get; set; } 
    } 

    public class Apontamento 
    { 
     public int Id { get; set; } 
     public string Filial { get; set; } 
     public string OperacaoCodigo { get; set; } 
     public virtual Operacao Operacao { get; set; } 
    } 

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



    public class ApontamentoMap : EntityTypeConfiguration 
    { 
     public ApontamentoMap() 
     { 
      ToTable("za4010"); 

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

      Property(x => x.OperacaoCodigo) 
       .HasColumnName("za4_oper"); 

      // 
      HasRequired(x => x.Operacao) 
       .WithMany() 
       .HasForeignKey(x => new { x.Filial, x.OperacaoCodigo }) 
       .WillCascadeOnDelete(false); 
     } 
    } 

    public static class Program 
    { 
     static void main() 
     { 
      //this not work, and I need it to work. 
      var context = new MyContext(); 
      var newObj = new Apontamento 
      { 
       Filial = "01", 
       OperacaoCodigo = "001" 
      }; 
      context.Apontamentos.Attach(newObj); 
      var desc = newObj.Operacao.Descricao; // Here Operacao Property is null 

      //this works 
      var newObjTmp = new Apontamento 
      { 
       Filial = "01", 
       OperacaoCodigo = "001" 
      }; 
      var operacao = context.Operacoes.Where(x => x.Codigo == "001"); 
      context.Apontamentos.Attach(newObj); 
      var descTmp = newObjTmp.Operacao.Descricao; // Operacao Property is ok. 

     } 
    } 

答えて

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; 
+0

はラディスラフ.... - 私は、サービス層、リポジトリとのUnitOfWorkに取り組んでいただきありがとうございます、必要があります私はUnitOfWorkとRepositoryにエンティティを作成するメソッドが公開されていますか?それを実装する正しい方法は何ですか? – will

+0

実際のリポジトリパターンを使用する場合、2番目の方法は正しい方法ではありません。リポジトリにアクセスする前にデータを読み込むように依頼してください。それ以外の場合は、特殊なメソッドを公開してエンティティを作成したり、エンティティ作成用のファクトリを追加したり –