Сообщение OData v4 веб-API ASP.NET с помощью BindingModel
У меня есть контроллер OData Web API, в котором есть POST для вставки UserProfile, но чтобы я не отображал свою базу данных, я бы хотел, чтобы метод Post принимал UserProfileBindingModel. Это возможно?
На данный момент у меня есть следующее в моих UserProfiles:
[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:
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; }
}
Свободный API для UserProfile - это:
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");
}
}
И UserProfileViewModel - это:
public class UserProfileViewModel
{
public string Id { get; set; }
public string Email { get; set; }
public string Username { get; set; }
public string FullName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateBirth { get; set; }
}
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 несовместим с базовым типом UserProfile предоставленного набора сущностей Default.Container.UserProfiles. Когда тип сущности указывается для канала OData или устройства чтения записей, он должен быть таким же или подтипом базового типа указанного набора сущностей.
Должен быть способ сделать это... есть идеи?
ура