Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 mvc 应使用现有记录时正在创建新记录_Asp.net Mvc_Json_Entity Framework - Fatal编程技术网

Asp.net mvc 应使用现有记录时正在创建新记录

Asp.net mvc 应使用现有记录时正在创建新记录,asp.net-mvc,json,entity-framework,Asp.net Mvc,Json,Entity Framework,我试图弄明白为什么当我将数据发布到MVC4控制器时,应该使用现有记录时会创建新记录 我的控制器如下: public ActionResult Edit(Song song) { JsonBase jsonBase; var dbSong = _songRepository.FindById(song.Id); TryUpdateModel(dbSong, String.Empty, null, new String[] { "CreatedDate", "Song

我试图弄明白为什么当我将数据发布到MVC4控制器时,应该使用现有记录时会创建新记录

我的控制器如下:

    public ActionResult Edit(Song song) {
    JsonBase jsonBase;
    var dbSong = _songRepository.FindById(song.Id);
    TryUpdateModel(dbSong, String.Empty, null, new String[] { "CreatedDate", "SongAlternateTitles", "SongWriterSongs", "Exploitations" });
    if (ModelState.IsValid) {
        _unitOfWork.Commit();
        jsonBase = new JsonBase(true, null, new { Id = dbSong.Id });
    }
    else {
        jsonBase = new JsonBase(false, ModelState.Values);
    }
    return Json(jsonBase);
}
public class Song : IEntity
{
    public virtual Int32 Id { get; set; }

    [Required]
    [StringLength(128, ErrorMessage = "Song Title cannot exceed 128 characters")]
    public virtual String Title { get; set; }

    [Required]
    [StringLength(512, ErrorMessage = "Song Description cannot exceed 512 characters")]
    public virtual String Description { get; set; }

    [StringLength(8000, ErrorMessage="Song lyrics cannot exceed 4096 characters")]
    public virtual String Lyrics { get; set; }

    [Required]
    [Display(Name="Song Status")]
    public virtual Boolean isMaster { get; set; }

    [StringLength(256, ErrorMessage = "File Path cannot exceed 256 characters.")]
    public virtual String AudioFilePath { get; set; }

    [StringLength(256, ErrorMessage = "File Path cannot exceed 256 characters.")]
    public virtual String CoverImageFilePath { get; set; }

    public virtual DateTime CreatedDate { get; set; }

    public virtual Int32? BPM { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<SongAlternateTitles> SongAlternateTitles { get; set; }
    public virtual ICollection<Exploitation> Exploitations { get; set; }
    public virtual ICollection<SongWriterSong> SongWriterSongs { get; set; }
    public virtual ICollection<Tweak> Tweaks { get; set; }
}
{"id":681,"title":"Another You","description":"Cascada - Everytime We Touch","lyrics":"","ismaster":false,"audiofilepath":"http://songistry.blob.core.windows.net/audiosamples/3211556309.mp3","coverimagefilepath":"http://songistry.blob.core.windows.net/coverimages/2711679216.jpg","tags":[{"id":43,"name":"Edgy","description":"This music is on the edge!","valid":true,"editing":false,"checked":true},{"id":44,"name":"Pop","description":"This music pops!","valid":true,"editing":false,"checked":true},{"id":47,"name":"Positive","description":"Positive","valid":true,"editing":false,"checked":true},{"id":45,"name":"Quirky","description":"Quirky","valid":true,"editing":false,"checked":true},{"id":46,"name":"R&B","description":"R&B","valid":true,"editing":false,"checked":true}],"songalternatetitles":[],"exploitations":[],"songwritersongs":[{"Id":742,"Pro":{"Id":2,"Name":"ASCAP"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"},"Percentage":100,"SongWriter":{"Id":1,"FirstName":"Mike","LastName":"Cottingham","Name":"Mike Cottingham","Pro":{"Id":2,"Name":"ASCAP"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"}}},{"Id":771,"Pro":{"Id":206,"Name":"ACUM"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"},"Percentage":0,"SongWriter":{"Id":8,"FirstName":"Jessica","LastName":"Cottingham","Name":"Jessica Cottingham","Pro":{"Id":1,"Name":"Socan"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"}}}]}
歌曲对象如下所示:

    public ActionResult Edit(Song song) {
    JsonBase jsonBase;
    var dbSong = _songRepository.FindById(song.Id);
    TryUpdateModel(dbSong, String.Empty, null, new String[] { "CreatedDate", "SongAlternateTitles", "SongWriterSongs", "Exploitations" });
    if (ModelState.IsValid) {
        _unitOfWork.Commit();
        jsonBase = new JsonBase(true, null, new { Id = dbSong.Id });
    }
    else {
        jsonBase = new JsonBase(false, ModelState.Values);
    }
    return Json(jsonBase);
}
public class Song : IEntity
{
    public virtual Int32 Id { get; set; }

    [Required]
    [StringLength(128, ErrorMessage = "Song Title cannot exceed 128 characters")]
    public virtual String Title { get; set; }

    [Required]
    [StringLength(512, ErrorMessage = "Song Description cannot exceed 512 characters")]
    public virtual String Description { get; set; }

    [StringLength(8000, ErrorMessage="Song lyrics cannot exceed 4096 characters")]
    public virtual String Lyrics { get; set; }

    [Required]
    [Display(Name="Song Status")]
    public virtual Boolean isMaster { get; set; }

    [StringLength(256, ErrorMessage = "File Path cannot exceed 256 characters.")]
    public virtual String AudioFilePath { get; set; }

    [StringLength(256, ErrorMessage = "File Path cannot exceed 256 characters.")]
    public virtual String CoverImageFilePath { get; set; }

    public virtual DateTime CreatedDate { get; set; }

    public virtual Int32? BPM { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
    public virtual ICollection<SongAlternateTitles> SongAlternateTitles { get; set; }
    public virtual ICollection<Exploitation> Exploitations { get; set; }
    public virtual ICollection<SongWriterSong> SongWriterSongs { get; set; }
    public virtual ICollection<Tweak> Tweaks { get; set; }
}
{"id":681,"title":"Another You","description":"Cascada - Everytime We Touch","lyrics":"","ismaster":false,"audiofilepath":"http://songistry.blob.core.windows.net/audiosamples/3211556309.mp3","coverimagefilepath":"http://songistry.blob.core.windows.net/coverimages/2711679216.jpg","tags":[{"id":43,"name":"Edgy","description":"This music is on the edge!","valid":true,"editing":false,"checked":true},{"id":44,"name":"Pop","description":"This music pops!","valid":true,"editing":false,"checked":true},{"id":47,"name":"Positive","description":"Positive","valid":true,"editing":false,"checked":true},{"id":45,"name":"Quirky","description":"Quirky","valid":true,"editing":false,"checked":true},{"id":46,"name":"R&B","description":"R&B","valid":true,"editing":false,"checked":true}],"songalternatetitles":[],"exploitations":[],"songwritersongs":[{"Id":742,"Pro":{"Id":2,"Name":"ASCAP"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"},"Percentage":100,"SongWriter":{"Id":1,"FirstName":"Mike","LastName":"Cottingham","Name":"Mike Cottingham","Pro":{"Id":2,"Name":"ASCAP"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"}}},{"Id":771,"Pro":{"Id":206,"Name":"ACUM"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"},"Percentage":0,"SongWriter":{"Id":8,"FirstName":"Jessica","LastName":"Cottingham","Name":"Jessica Cottingham","Pro":{"Id":1,"Name":"Socan"},"Publisher":{"Id":2,"Name":"Some Publisher","Phone":"4035555555","ContactName":"Some Guy","ContactEmail":"guy@songistry.com","ContactPhone":"4035555555","Address":"123 fake street"}}}]}

应使用现有记录时,正在为标记创建新记录。我做错了什么?我假设,如果我在包含ID的文件中传递标记,模型绑定器会自动计算出来。

模型绑定器对ID一无所知。它甚至不知道身份是什么。因此,它无法将JSON中的更改合并到标记集合中

我不确定直接绑定到实体的方式是否有解决方案。我建议为整个结构创建视图模型(由于视图模型类是琐碎的DTO,所以这项工作不多)。然后,您需要手动合并更改,这可能涉及在视图模型标记和实体标记之间进行连接


这是一个很好的系统,即使一开始看起来很费劲。它给了你完全的控制权。您甚至可以添加诸如“如果且仅当标记名更改时,我将标记名更改日期时间设置为UtcNow”之类的过程。绑定不能扩展到做这些事情。

基于安全和体系结构的原因,模型绑定到实体是一种强烈的反模式。也许你应该摆脱它。公共虚拟字符串标题{get;set;}…为什么字符串是字符串..我的意思是大写字母lettar?@usr谢谢你的评论,但是,没有一点详细说明,它提供了零值..@BhushanFirake首选项。在c#中,string是System.string的别名,我只是更喜欢使用string,但从技术上讲它们是一样的。@BhushanFirake我理解标准惯例,也就是说,我更喜欢使用string。不管怎样,这与我为什么会有这个问题无关。这就是我最终解决这个问题的原因。谢谢你的帮助!