Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 带有BindingModel的ASP.NET Web API OData v4 Post_Asp.net Web Api_Odata_Odata V4 - Fatal编程技术网

Asp.net web api 带有BindingModel的ASP.NET Web API OData v4 Post

Asp.net web api 带有BindingModel的ASP.NET Web API OData v4 Post,asp.net-web-api,odata,odata-v4,Asp.net Web Api,Odata,Odata V4,我有一个ODataWebAPI控制器,它有一个POST来插入UserProfile,但为了不公开我的数据库实体,我希望POST方法接受UserProfileBindingModel。这可能吗 目前,我的用户配置文件中有以下内容: [EnableQuery(PageSize = 100, AllowedQueryOptions = AllowedQueryOptions.All)] public IHttpActionResult Get() { return Ok(_db.UserProf

我有一个ODataWebAPI控制器,它有一个POST来插入UserProfile,但为了不公开我的数据库实体,我希望POST方法接受UserProfileBindingModel。这可能吗

目前,我的用户配置文件中有以下内容:

[EnableQuery(PageSize = 100, AllowedQueryOptions = AllowedQueryOptions.All)]
public IHttpActionResult Get()
{
   return Ok(_db.UserProfile.ToUserViewModels());
}


[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
public IHttpActionResult Post([FromBody] UserProfileBindingModel model)
{
   if (!ModelState.IsValid)
      return BadRequest(ModelState);

   var userProfile = ToUserProfile(model);

   _db.UserProfile.AddOrUpdate(userProfile);
   _db.SaveChanges();
   return Created(userProfile);
}
这是我的ODataConfig.cs文件:

public static class ODataConfig
{
   public static void Register(HttpConfiguration config)
   {
      // OData builder
      var builder = new ODataConventionModelBuilder();

      // Register entities
      builder.EntitySet<UserProfile>("UserProfiles").EntityType.Name = "UserProfile";
      builder.EntitySet<UserProfileViewModel>("UserProfileViewModel").EntityType.Name = "UserProfileViewModel";
      builder.EntitySet<UserProfileBindingModel>("UserProfileBindingModel").EntityType.Name = "UserProfileBindingModel";


      // OData model config
      var model = builder.GetEdmModel();
      // OData route config
      config.MapODataServiceRoute("odata", "odata", model);
   }
}
UserProfile的Fluent API是:

public class UserProfile
{
   public string Id { get; set; }
   public DateTime DateCreated { get; set; }
   public DateTime DateModified { get; set; }
   public string Email { get; set; }
   public string Username { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public DateTime DateBirth { get; set; }
}
public class UserProfilesMap : EntityTypeConfiguration<UserProfile>
{
   public UserProfilesMap()
   {
      // Primary Key
      HasKey(t => t.Id);

      // Properties
      Property(t => t.Id)
         .IsRequired()
         .HasColumnType("nvarchar")
         .HasMaxLength(128)
         .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
      Property(t => t.DateCreated)
         .IsRequired()
         .HasColumnType("datetime");
      Property(t => t.DateModified)
         .IsRequired()
         .HasColumnType("datetime");
      Property(t => t.Email)
         .IsRequired()
         .HasColumnType("nvarchar")
         .HasMaxLength(256);
      Property(t => t.Username)
         .IsRequired()
         .HasColumnType("nvarchar")
         .HasMaxLength(256);
      Property(t => t.FirstName)
         .IsRequired()
         .HasColumnType("nvarchar")
         .HasMaxLength(100);
      Property(t => t.LastName)
         .IsRequired()
         .HasColumnType("nvarchar")
         .HasMaxLength(100);
      Property(t => t.DateBirth)
         .IsRequired()
         .HasColumnType("datetime");

      // Table & Column Mappings
      ToTable("UserProfiles");
      Property(t => t.Id).HasColumnName("Id");
      Property(t => t.DateCreated).HasColumnName("DateCreated");
      Property(t => t.DateModified).HasColumnName("DateModified");
      Property(t => t.Email).HasColumnName("Email");
      Property(t => t.Username).HasColumnName("Username");
      Property(t => t.FirstName).HasColumnName("FirstName");
      Property(t => t.LastName).HasColumnName("LastName");
      Property(t => t.DateBirth).HasColumnName("DateBirth");
   }
}
UserProfileBindingModel是:

public class UserProfileBindingModel
{
   public long Id { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [EmailAddress(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidEmail")]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [Display(Name = "Email", ResourceType = typeof(Resources))]
   public string Email { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustUnderCharacters")]
   [Display(Name = "FirstName", ResourceType = typeof(Resources))]
   public string FirstName { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "LastName", ResourceType = typeof(Resources))]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustUnderCharacters")]
   public string LastName { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "Username", ResourceType = typeof(Resources))]
   [StringLength(30, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   public string Username { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "Password", ResourceType = typeof(Resources))]
   [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [DataType(DataType.Password)]
   public string Password { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "ConfirmPassword", ResourceType = typeof(Resources))]
   [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [Compare("Password", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "PasswordMustMatch")]
   [DataType(DataType.Password)]
   public string ConfirmPassword { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "DateBirth", ResourceType = typeof(Resources))]
   [DataType(DataType.Date)]
   public DateTime DateBirth { get; set; }
}
Get方法工作得很好,但是使用post方法,我得到以下消息:

实体类型“UserProfileBindingModel”与提供的实体集“Default.Container.UserProfiles”的基类型“UserProfile”不兼容。为OData提要或条目读取器指定实体类型时,该实体类型必须与指定实体集的基本类型相同或是其子类型

一定有办法做到这一点…有什么想法吗


干杯

你的帖子url是什么?你应该把Post(…)方法放在正确的控制器中。嗨@SamXu,我录了一段视频,谢谢你的帮助
public class UserProfileBindingModel
{
   public long Id { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [EmailAddress(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "InvalidEmail")]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [Display(Name = "Email", ResourceType = typeof(Resources))]
   public string Email { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustUnderCharacters")]
   [Display(Name = "FirstName", ResourceType = typeof(Resources))]
   public string FirstName { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "LastName", ResourceType = typeof(Resources))]
   [StringLength(100, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustUnderCharacters")]
   public string LastName { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "Username", ResourceType = typeof(Resources))]
   [StringLength(30, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   public string Username { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "Password", ResourceType = typeof(Resources))]
   [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [DataType(DataType.Password)]
   public string Password { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "ConfirmPassword", ResourceType = typeof(Resources))]
   [StringLength(255, ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "MustBetweenCharacters", MinimumLength = 6)]
   [Compare("Password", ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "PasswordMustMatch")]
   [DataType(DataType.Password)]
   public string ConfirmPassword { get; set; }

   [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "IsRequired")]
   [Display(Name = "DateBirth", ResourceType = typeof(Resources))]
   [DataType(DataType.Date)]
   public DateTime DateBirth { get; set; }
}