您好,
我遇到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]隐藏它,因为有时必须包含关系。 当发生这种情况时,我也不想一直手动分离每个实体。
问题是,有没有办法禁用或解决此问题?
由于
答案 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
}