public void OnTypeCreation(MetadataContainer metadataContainer)
 {
     metadataContainer.Entity <Foo>().Projection(x => x.Id2).IsKey();
     metadataContainer.Add(new FooMetadata());
     metadataContainer.Entity <Bar>().Projection(x => x.FooSet).Association().WithName("MyAssociation").
     WithThisKey(x => x.Id2, x => x.Id).WithOtherKey(x => x.Id2, x => x.Id);
 }
        /// <summary>
        ///   A linkTable entity contains many properties that can be annotated as KeyAttribute. In this method we mark all of them to be excluded (using the ExceludeAttribute), except for
        ///   those of them that are actually allocated as key properties. This way, the generated entity at the client will only have properties that really are KeyAttributes.
        /// </summary>
        /// <param name="metaData"> </param>
        private void MarkLinkTableKeysAsDataMembers(MetadataClass <TLinkTable> metaData)
        {
            var linkTableMetaData = _metaDataContainer.Entity <TLinkTable>();

            var typeDescr = _metaDataContainer.GetTypeDescriptor(typeof(TLinkTable));

            foreach (var propDescr in typeDescr.GetProperties().OfType <PropertyDescriptor>())
            {
                var memberMetadata = metaData.GetMemberMetadata(propDescr.Name);
                if (memberMetadata == null
                    ||
                    (memberMetadata.OfType <KeyAttribute>().Any() == false &&
                     memberMetadata.OfType <AssociationAttribute>().Any() == false))
                {
                    linkTableMetaData.AddMetadata(propDescr.Name, new ExcludeAttribute());
                }
            }
        }
        public M2M4RiaExpression(MetadataContainer metaDataContainer, string m2m1, string m2mView1, string m2mView2,
                                 string m2m2)
        {
            _metaDataContainer = metaDataContainer;

            var linkTableMetaData = metaDataContainer.Entity <TLinkTable>();
            var object1MetaData   = metaDataContainer.Entity <TObject1>();
            var object2MetaData   = metaDataContainer.Entity <TObject2>();

            object1MetaData.AddMetadata(m2mView1, new IncludeAttribute());
            object2MetaData.AddMetadata(m2mView2, new IncludeAttribute());

            var object1Keys = GetKeys <TObject1>(metaDataContainer);
            var object2Keys = GetKeys <TObject2>(metaDataContainer);

            SetupLinkTableAssociations(x => x.Object1, m2mView1, object1Keys.ToList());
            SetupLinkTableAssociations(x => x.Object2, m2mView2, object2Keys.ToList());

            MarkLinkTableKeysAsDataMembers(linkTableMetaData);

            object1MetaData.AddMetadata(
                m2mView1,
                new LinkTableViewAttribute
            {
                LinkTableType           = typeof(TLinkTable),
                M2MPropertyName         = m2m1,
                ElementType             = typeof(TObject2),
                OtherEndAssociationName = typeof(TObject1).Name + "_" + m2mView1
            });
            object2MetaData.AddMetadata(
                m2mView2,
                new LinkTableViewAttribute
            {
                LinkTableType           = typeof(TLinkTable),
                M2MPropertyName         = m2m2,
                ElementType             = typeof(TObject1),
                OtherEndAssociationName = typeof(TObject2).Name + "_" + m2mView2
            });
        }
 public void OnTypeCreation(MetadataContainer metadataContainer)
 {
     metadataContainer.Entity <Dog>().Projection(x => x.Trainers).M2M(
         x => x.DogTrainers, x => x.DogTrainers, x => x.Dogs);
 }
 public void OnTypeCreation(MetadataContainer metadataContainer)
 {
     metadataContainer.Entity<Dog>().Projection(x => x.Trainers).M2M(
         x => x.DogTrainers, x => x.DogTrainers, x => x.Dogs);
 }