Entity framework 4 附加对象后加载属性

Entity framework 4 附加对象后加载属性,entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,在这里询问之前,我试着用谷歌搜索它,但我找不到任何解决方案 我有这两个类和一个一对多的映射 我正在尝试附加一个新对象 public class MyContext : DbContext { public IDbSet Operacoes { get; set; } public IDbSet Apontamentos { get; set; } } public class Operacao { public s

在这里询问之前,我试着用谷歌搜索它,但我找不到任何解决方案

我有这两个类和一个一对多的映射

我正在尝试附加一个新对象

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. } } 公共类MyContext:DbContext { 公共IDbSet操作{get;set;} 公共IDbSet Apontamentos{get;set;} } 公演歌剧 { 公共字符串{get;set;} 公共字符串Codigo{get;set;} 公共字符串描述符{get;set;} } 公共级公寓 { 公共int Id{get;set;} 公共字符串{get;set;} 公共字符串OperacaoCodigo{get;set;} 公共虚拟操作操作{get;set;} } 公共类操作映射:EntityTypeConfiguration { 公共操作手册() { ToTable(“za6010”); HasKey(x=>new{x.durth,x.Codigo}) .Property(x=>x.Codigo).HasColumnName(“za6_cod”); 属性(x=>x.descrico).HasColumnName(“za6_desc”); } } 公共类ApontamentoMap:EntityTypeConfiguration { 公共ApontamentoMap() { ToTable(“za4010”); HasKey(x=>new{x.durth,x.Id}); 属性(x=>x.operacocodigo) .HasColumnName(“za4_oper”); // HasRequired(x=>x.Operacao) .有很多 .HasForeignKey(x=>new{x.durth,x.OperacaoCodigo}) .WillCascadeOnDelete(假); } } 公共静态类程序 { 静态void main() { //这不管用,我需要它来管用。 var context=new MyContext(); var newObj=新Apontamento { 孝顺=“01”, OperacaoCodigo=“001” }; 上下文.Apontamentos.Attach(newObj); var desc=newObj.Operacao.descripao;//此处Operacao属性为null //这很有效 var newObjTmp=新的Apontamento { 孝顺=“01”, OperacaoCodigo=“001” }; var operacao=context.Operacoes.Where(x=>x.Codigo==“001”); 上下文.Apontamentos.Attach(newObj); var descTmp=newObjTmp.Operacao.descripao;//Operacao属性正常。 } }
第一种情况不起作用,因为您的实体未被动态代理包装,并且导航属性不能延迟加载。试试这个:

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;

谢谢你,拉迪斯拉夫。。。。我正在处理服务层、存储库和UnitOfWork,我是否应该公开一个方法来在UnitOfWork和存储库中创建实体?实现它的正确方法是什么?如果您使用真实的存储库模式,那么正确的方法是您不喜欢的第二种方法——要求存储库在访问数据之前加载数据。否则,公开创建实体的特殊方法或为实体创建添加工厂。