3

我关注此链接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>

请帮助我,我尝试了各种方法,但仍然没有运气。谢谢。

4

2 回答 2

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 不会检查提供的实体的内容,并将任何缺少的属性设置为 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);
    }
}
于 2015-11-18T22:25:06.730 回答
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
                };
        }
    }
于 2013-12-31T11:31:12.757 回答