EF Core中不需要的关系加载

时间:2016-12-01 14:29:24

标签: asp.net-core entity-framework-core

您好,

我遇到EF Core功能问题 - 当实体独立地连接到当前的dbCotnext时,它会自动将相关实体绑定在一起。

让我们假设以下两个实体:

    public class Seller {
        public Guid Id {get;set;}
        public List<Product> Products {get;set;}
    }

    public class Product {
        public Guid Id {get;set;}
        public Guid SellerId {get;set;}
        public Seller Seller {get;set;}
    }

控制器中的一些代码(仅用于想象):

var seller = DbContext.Sellers.FirstOrDefault(e => e.Id == someId);
var products = DbContext.Products.All(t => t.SellerId == someId);
return StatusCode(200, products);

返回的JSON将类似于

[
    {
        "id": "1234",
        "sellerId": "5678",
        "seller": {
            "id" : "5678",
            "products": ["(muted reference loop exception from json converter here.)"]
        }
    }
]

但我不希望卖家被收录在每件产品中。如果我这样做,我就会为其他人打电话给 Products.Include(...)。 我不想抓取实体并使导航属性为空。 我不想用[JsonIgnore]隐藏它,因为有时必须包含关系。 当发生这种情况时,我也不想一直手动分离每个实体。

问题是,有没有办法禁用或解决此问题?

由于

3 个答案:

答案 0 :(得分:3)

不,你不能/不应该。你需要单独的dto类。

Newtonsoft.Json负责对象序列化,它决定必须[不]序列化哪些属性。您只能使用它的属性来控制它的行为。你不能从EF控制它:)

如果您希望有时包含属性,有时不包含 - 您需要两个不同的类(每个类都具有正确的属性)。其他一切都是黑客攻击。 DTO,Automapper以及所有这些 - 欢迎您。

BTW,对于外部API和内部数据存储具有不同的类,您可以轻松地更改其中一个而不会打破其他(将来)。

答案 1 :(得分:1)

您必须更改模型类并使用可空类型。

 public class Product {
        public Guid Id {get;set;}
        public Guid SellerId {get;set;}
        public Seller? Seller {get;set;}
    }

答案 2 :(得分:1)

您是否在Startup类上尝试过此配置:

public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.

    services.AddMvc().AddJsonOptions(a => a.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);

    // other code
}