我关注此链接Supporting OData Actions in ASP.NET Web API 我想传递我的对象/实体作为这样的参数:
ActionConfiguration addNewPatient = builder.Entity<Patient>().Collection.Action("AddNewPatient");
addNewPatient.Parameter<int>("hospId");
addNewPatient.Parameter<int>("docId");
addNewPatient.Parameter<Patient>("patient");
addNewPatient.Returns<bool>();
但是我遇到了这个问题:
System.ArgumentException: Invalid parameter type 'Patient'.
A non-binding parameter type must be either Primitive, Complex, Collection of Primitive or a Collection of Complex.
Parameter name: parameterType
我试图实现这个
ActionConfiguration addNewPatient = builder.Entity<Patient>().Collection.Action("AddNewPatient");
addNewPatient.Parameter<int>("hospId");
addNewPatient.Parameter<int>("docId");
var patientConfig = builder.StructuralTypes.OfType<EntityTypeConfiguration>().Single(x => x.Name == "Patient");
addNewPatient.SetBindingParameter("patient", patientConfig, false);
addNewPatient.Returns<bool>();
但我不能再调用方法POST ../odata/Patient/AddNewPatient
<FunctionImport Name="AddNewPatient" ReturnType="Edm.Boolean" IsBindable="true">
<Parameter Name="patient" Type="Patient"/>
<Parameter Name="hospId" Type="Edm.Int32" Nullable="false"/>
<Parameter Name="docId" Type="Edm.Int32" Nullable="false"/>
</FunctionImport>
请帮助我,我尝试各种方式,但仍然没有运气。 感谢。
答案 0 :(得分:3)
您可以使用ActionConfiguration.EntityParameter()方法将实体作为参数绑定到OData操作方法。
以下是一个例子:
ActionConfiguration validate = ModelBuilder.EntityType<TEntity>()
.Collection.Action("Validate");
validate.Namespace = "Importation";
validate.EntityParameter<TEntity>(typeof(TEntity).Name);
validate.CollectionParameter<string>("UniqueFields");
validate.Returns<ValidationResult>();
但是,请注意,ModelState不会检查提供的Entity的内容,并将任何缺少的属性设置为null,并且模型中超出StringLength(x)注释的属性仍将通过。如果您希望之后验证实体本身,请在您的操作方法中使用以下代码:
[HttpPost]
public virtual IHttpActionResult Validate(ODataActionParameters parameters)
{
//First we check if the parameters are correct for the entire action method
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
else
{
//Then we cast our entity parameter in our entity object and validate
//it through the controller's Validate<TEntity> method
TEntity Entity = (TEntity)parameters[typeof(TEntity).Name];
Validate(Entity, typeof(TEntity).Name);
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
IEnumerable<string> uniqueFields = parameters["UniqueFields"] as IEnumerable<string>;
bool result = Importer.Validate(Entity, uniqueFields);
return Ok(result);
}
}
答案 1 :(得分:0)
向/ odata / Patient发布您的新患者对象是不是更好?这就是它的用途。
如果你想按照你所描述的方式去做,你需要创建一个中间类型,并创建该类型的参数,然后在它和你的Edm类型之间进行转换。
var createPatient = modelBuilder.Entity<Patient>().Collection.Action("AddNewPatient");
createPatient.CollectionParameter<PatientPdo>("patient");
其中PatientPdo与Patient完全相同,只是删除了导航属性。这就是它所抱怨的,它是Edm的类型,可以这么说。
public class PatientPdo
{
public long Id{ get; set; }
public Entity ToEdmEntity()
{
return new Patient
{
Id= Id
};
}
}