private MusicalSource ParseRecord(XElement recordElement)
        {
            var record = new MusicalSource();

            foreach (var field in recordElement.Elements().Where(e => e.Name.LocalName == "controlfield"))
            {
                var tag = field.Attributes().FirstOrDefault(a => a.Name.LocalName == "tag")?.Value;
                if (tag == null)
                {
                    continue;
                }

                if (tag == "001")
                {
                    record.Id = field.Value;
                }
            }

            foreach (var field in recordElement.Elements().Where(e => e.Name.LocalName == "datafield"))
            {
                var tag = field.Attributes().FirstOrDefault(a => a.Name.LocalName == "tag")?.Value;
                if (tag == null)
                {
                    continue;
                }
                if (!FieldFactories.ContainsKey(tag))
                {
                    continue;
                }

                var entity     = FieldFactories[tag]();
                var properties = entity.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                foreach (var property in properties)
                {
                    var subfieldAttribute = property.GetCustomAttribute <MarcSubfieldAttribute>();
                    if (subfieldAttribute == null)
                    {
                        continue;
                    }

                    var value = field.Elements()
                                .FirstOrDefault(e => e.Attributes().FirstOrDefault(a => a.Name.LocalName == "code")?.Value == subfieldAttribute.Code)?
                                .Value;
                    property.SetValue(entity, value);   //TODO: Type conversion, converter types, etc.
                }
                entity.MusicalSource = record;
                ExtractDataFromSubfields(record, entity);

                if (entity.GetType() == typeof(Incipit))
                {
                    dbContext.Attach(entity);
                }
            }

            dbContext.MusicalSources.Add(record);

            return(record);
        }
        private void ExtractDataFromSubfields(MusicalSource record, MusicalSourceField entity)
        {
            var composer = entity as Person;

            if (composer != null)
            {
                record.ComposerName  = composer.PersonalName;
                record.ComposerDates = composer.Dates;
            }

            var uniformTitle = entity as UniformTitle;

            if (uniformTitle != null)
            {
                record.Title               = uniformTitle.Title;
                record.FormSubheading      = uniformTitle.FormSubheading;
                record.MediumOfPerformance = uniformTitle.MediumOfPerformance;
                record.PartOrSectionNumber = uniformTitle.PartOrSectionNumber;
            }

            var incipit = entity as Incipit;

            if (incipit != null)
            {
                var score = plaineAndEasieService.Parse(incipit);
                if (score != null)
                {
                    try
                    {
                        incipit.RhythmDigest         = new RhythmDigestParser().ParseBack(score);
                        incipit.RhythmRelativeDigest = new RhythmRelativeDigestParser().ParseBack(score);

                        var intervals      = score.ToIntervals().Take(12).ToArray();
                        var intervalNumber = 1;
                        foreach (var interval in intervals)
                        {
                            typeof(Incipit).GetProperty($"Interval{intervalNumber++}").SetValue(incipit, interval);
                        }
                    }
                    catch { }
                }
            }
        }