我有一个使用WebAPI和EF 6的OData服务构建。我使用流畅的api来创建我的模型。它工作正常,但当我使用$expand
时,它会忽略扩展属性为null
的实体。
这是一个简化的例子:
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public int? AddressId { get set; } // Note that Address is optional
public Address Address { get; set; }
}
public class Address
{
public int Id { get; set; }
public string Street{ get; set; }
}
public class CustomersController : ODataController
{
[EnableQuery]
public virtual IQueryable<Customer> Get(ODataQueryOptions<Customer> q)
{
// I return IQueryable from DBSet here...
return db.GetDbSet<Customer>();
}
}
Customer
不需要地址。如果我像/customers?$expand=Address
那样查询它,则不会将Customers
包含在Address == null
中。它只会返回Customer
存在Customer.Address
的实体。
我猜它会进行内连接,因此不会获得没有Customer
的{{1}}实体。 有没有办法包含地址为空的客户?
当前输出:
Address
通缉输出:
[
{
Id: 1,
Name: 'Customer1',
AddressId: 1,
Address :
{
Id: 1,
Street: 'Some street'
}
}
]
以上模型就是一个例子。我实际上得到了更大的模型,但我尽量保持示例尽可能短,以提供mcve。我已阅读this和this问题,但我没有收到任何错误。我根本没有获得实体。
答案 0 :(得分:0)
使用$expand
时,想要的输出似乎是OData服务的正常行为。错误是由我的映射引起的。
出于某种原因,我有一些旧代码需要Address
,即使外键本身可以为空。
public class CustomerMap : EntityTypeConfiguration<Customer>
{
public CustomerMap()
{
// Other code...
// This is wrong!
this.HasReguired(c => c.Address).WithMany(a => a.Customers);
// This is right!
this.HasOptional(c => c.Address).WithMany(a => a.Customers);
}
}
由于映射,EF将SQL转换为INNER JOIN
而不是OUTER JOIN
。