public static void SetForeignKey <T>(this T @this, Guid?id = null) where T : IId
        {
            // Step 1. get a property with the SetForeignKeyAttribute
            foreach (PropertyInfo propertyInfo in @this.GetType().GetProperties())
            {
                // Set value
                if (propertyInfo.GetCustomAttribute <SetForeignKeyAttribute>() != null)
                {
                    // Set value
                    propertyInfo.SetValue(@this, @this.Id);
                }

                // Step in 1:1
                if (propertyInfo.PropertyType.GetInterfaces().Contains(typeof(IId)))
                {
                    IId child = propertyInfo.GetValue(@this) as IId;
                    if (child != null)
                    {
                        child.SetForeignKey(@this.Id);
                    }
                }

                // Step into collection 1:N
                if (propertyInfo.PropertyType.GetInterfaces().Contains(typeof(IEnumerable)))
                {
                    foreach (var item in propertyInfo.GetValue(@this) as IEnumerable)
                    {
                        IId child = item as IId;
                        if (child != null)
                        {
                            child.SetForeignKey(@this.Id);
                        }
                    }
                }
            }
        }