我在使用 Ef 4.1 代码优先实现时遇到了一些问题。
public class Foo()
{
public Foo()
{
Id = Guid.NewGuid();
Bars = new Collection<Bar>();
}
public Guid Id { get; set; }
public string Name { get; set; }
public virtual ICollection Bars { get; set; }
}
public class Bar()
{
public Bar()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
public virtual Foo Foo { get; set;}
}
public class MyContext : DbContext
{
public MyContext()
{
Configuration.ProxyCreationEnabled = false;
}
public DbSet<Foo> Foos { get; set; }
public DbSet<Bar> Bars { get; set; }
}
当我在其上放置一个 wcf 服务时,它只返回一个空的 Bars 集合。如果我打开 ProxyCreationEnabled,集合将被填充,但由于 EF 代理创建,我将收到 wcf 异常和关闭的连接。
有什么建议吗?
最佳答案
如果您还想加载 Bars,则必须使用预先加载。 EF 从不自己加载相关对象。您必须始终通过预加载或延迟加载向 EF 请求相关对象。如果您打开代理创建,EF 将尝试在数据序列化期间通过延迟加载来加载 Bars 集合(第一次访问该集合),但是您会因为上下文关闭或序列化数据中的循环( Bar.Foo
和 Foo.Bars
创建循环)而出现异常).
要使用预先加载,您必须在查询中添加 Include
方法:
var data = context.Foos.Include(f => f.Bars).ToList();
为避免循环,您必须删除 Foo
中的 Bar
或使用具有 DataContract
和 IsReference=true
属性的 DataMember
标记 Foo 和 Bar:
[DataContract(IsReference=true)]
public class Foo()
{
public Foo()
{
Id = Guid.NewGuid();
Bars = new Collection<Bar>();
}
[DataMember]
public Guid Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual ICollection Bars { get; set; }
}
[DataContract(IsReference=true)]
public class Bar()
{
public Bar()
{
Id = Guid.NewGuid();
}
[DataMember]
public Guid Id { get; set; }
[DataMember]
public string Name { get; set; }
[DataMember]
public virtual Foo Foo { get; set;}
}
或者您必须将 Foo
中的 Bar
属性标记为未序列化以打破循环:
public class Bar()
{
public Bar()
{
Id = Guid.NewGuid();
}
public Guid Id { get; set; }
public string Name { get; set; }
[IgnoreDataMember]
public virtual Foo Foo { get; set;}
}
关于c# - EF、Code First、WCF => 空集合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5867615/