c# - EF、Code First、WCF => 空集合问题

标签 c# wcf ef-code-first entity-framework-4.1

我在使用 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.FooFoo.Bars 创建循环)而出现异常).

要使用预先加载,您必须在查询中添加 Include 方法:

var data = context.Foos.Include(f => f.Bars).ToList();

为避免循环,您必须删除 Foo 中的 Bar 或使用具有 DataContractIsReference=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/

相关文章:

entity-framework - 使用 EF Code First 删除整个实体图,包括关系

mysql - 生成的标识符对于约束名称来说太长

ef-code-first - 在 Entity Framework 4.1 Code First 中排除列可更新

C# 复杂继承

c# - 当条件在数据库中验证时,EF Core 3.0 在 LINQ 中进行条件排序

wcf - 如何从 WCF 服务读取 xml 文件?

c# - 在 C# 中使用 FTP 复制文件

c# - 在 if 语句中返回

c# - 从 WindowsIdentity 和 Thread.CurrentPrincipal 检索 WindowsPrincipal 之间有什么区别?

asp.net - Wcf - 已超出传入消息 (65536) 的最大消息大小配额?