D6mi
D6mi

Reputation: 621

Entity Framework 6 MySQL - Properties not properly inserted

I'm using EF6 with MySQL and the idea's to populate the database with movies created through JSON parsing.

This is my Movie class :

[JsonObject(MemberSerialization.OptIn)]
[Table("movies")]
public class MovieJSON
{
    [Key]
    public int Id { get; set; }

    [JsonProperty(PropertyName = "Title")]
    [Column("title")]
    public String Title { get; set; }

    [JsonProperty(PropertyName = "Year")]
    [Column("year")]
    public int Year { get; set; }

    [JsonProperty(PropertyName = "Genre")]
    [Column("genre")]
    public String Genre { get; set; }

    [JsonProperty(PropertyName = "Director")]
    [Column("director")]
    public String Director { get; set; }

    [JsonProperty(PropertyName = "Actors")]
    [Column("actors")]
    public String Actors { get; set; }

    [JsonProperty(PropertyName = "Plot")]
    [Column("plot")]
    public String Plot { get; set; }

    [JsonProperty(PropertyName = "Poster")]
    [Column("poster")]
    public String Poster { get; set; }

    [JsonProperty(PropertyName = "Metascore")]
    public String Metascore { get; set; }

    [Column("metascore")]
    public int MetascoreInt
    {
        get
        {
            int result;
            if (int.TryParse(Metascore, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result))
                return result;
            return 0;
        }
    }

    [JsonProperty(PropertyName = "imdbRating")]
    public String ImdbRating { get; set; }

    [Column("imdb_rating")]
    public Decimal ImdbRatingDecimal
    {
        get
        {
            Decimal result;
            if (Decimal.TryParse(ImdbRating, out result))
                return result;
            return 0;
        }
    }

    [JsonProperty(PropertyName = "imdbVotes")]
    public String ImdbVotes { get; set; }

    [Column("imdb_votes")]
    public long ImdbVotesLong
    {
        get
        {
            long result;
            String stringToParse = ImdbVotes.Remove(ImdbVotes.IndexOf(','), 1);

            if (long.TryParse(stringToParse, out result))
                return result;
            return 0;
        }
    }

    [JsonProperty(PropertyName = "imdbID")]
    [Column("imdb_id")]
    public String ImdbID { get; set; }

    [JsonProperty(PropertyName = "type")]
    [Column("type")]
    public String Type { get; set; }

    public override string ToString()
    {
        String[] propertiesToIgnore = {"MetascoreInt", "ImdbRatingDecimal", "ImdbVotesLong"};
        var sb = new StringBuilder();

        PropertyInfo[] properties = GetType().GetProperties();

        foreach (PropertyInfo propertyInfo in properties)
        {
            if (propertiesToIgnore.Contains(propertyInfo.Name))
                continue;

            sb.AppendLine(String.Format("{0} : {1} ",
                propertyInfo.Name, propertyInfo.GetValue(this, null)));
        }

        return sb.ToString();
    }
}

This is my EF6 configuration-context class (I'm ignoring the String fields and instead, using the Helper ones since the database is configured to accept int for Metascore and so on) :

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MovieJSON>().Ignore(e => e.Metascore).Ignore(e => e.ImdbRating).Ignore(e => e.ImdbVotes);
        base.OnModelCreating(modelBuilder);
    }

Additional image info :

Object values before insertion into the database (all values are properly set)

Valid XHTML http://imagizer.imageshack.us/v2/800x600q90/689/8x5m.png

Values in the database (ignore the duplication of data) :

Valid XHTML http://imagizer.imageshack.us/v2/800x600q90/844/nvc5.png

I can't figure why do I get the zero's in the numerical fields.

Any help would be mucho appreciated! :)

All the best

Upvotes: 0

Views: 392

Answers (1)

123 456 789 0
123 456 789 0

Reputation: 10865

Try this, same goes to your other Numerical Properties that you don't want the string JSON property mapped to the database

private string _metaScore;
[JsonProperty(PropertyName = "Metascore")]
public String Metascore { 
get { return _metaScore; } 
set { _metaScore = value; 
      int result;
      if(int.TryParse(_metaScore, NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out result))
       MetaScoreInt = result;
    }
}

[Column("metascore")]
public int MetascoreInt
{
    get;set;
}

Upvotes: 1

Related Questions