/// <summary> /// Add BCS column to SharePoint list /// </summary> /// <param name="list">List to add the field to</param> /// <param name="fieldName">Internal name</param> /// <param name="fieldDisplay">Display name</param> /// <param name="entityName">Entity as defined in Bdc model, e.g. "Customers"</param> /// <param name="bdcFieldName">Field name in related list</param> /// <param name="relatedField">Usually entity name + "_ID" (e.g. "Customers_ID")</param> /// <param name="systemInstanceName">Model name, e.g. "XYZBdcModel"</param> /// <param name="entityNamespace">Model namespace, e.g. "YourCompany.Namespace.Model"</param> /// <param name="isRequired">true if column is mandatory</param> /// <returns></returns> public static bool AddBdcColumn(this SPList list, string fieldName, string fieldDisplay, string entityName, string bdcFieldName, string relatedField, string systemInstanceName, string entityNamespace, bool isRequired) { // TODO: replace list Guid using (var site = new SPSite(list.ParentWeb.Site.Url)) { using (var web = site.OpenWeb()) { try { web.AllowUnsafeUpdates = true; var list2 = web.Lists[list.ID]; if (list2.Fields.ContainsField(fieldName)) { list2.Fields.Delete(fieldName); list2.Update(); } if (!list2.Fields.ContainsField(fieldName)) { // Manually create schemaXML: var schemaXml = string.Format(@" <Field Type=""BusinessData"" DisplayName=""{0}"" Required=""{8}"" ID=""{1}"" SourceID=""{9}"" StaticName=""{2}"" BaseRenderingType=""Text"" Name=""{2}"" ColName=""nvarchar16"" RowOrdinal=""0"" Version=""2"" SystemInstance=""{3}"" EntityNamespace=""{4}"" EntityName=""{5}"" BdcField=""Name"" Profile=""/_layouts/15/ActionRedirect.aspx?EntityNamespace={6}&EntityName={1}&LOBSystemInstanceName={3}&ItemID="" HasActions=""True"" SecondaryFieldBdcNames=""0"" RelatedField=""{7}"" SecondaryFieldWssNames=""0"" RelatedFieldBDCField="""" RelatedFieldWssStaticName=""{2}"" SecondaryFieldsWssStaticNames=""0"" AddFieldOption=""AddToAllContentTypes, AddFieldToDefaultView"" /> " , fieldName // 0 - provisionally assign internal name instead of display name , Guid.NewGuid() // 1 - random Guid , fieldName // 2 - internal name , systemInstanceName // 3 , entityNamespace // 4 , entityName // 5 , entityNamespace.Replace(".", "%2E") // 6 - namespace in url format , relatedField // 7 , isRequired.ToString().ToUpper() // 8 , string.Format("{{{0}}}", list.ID) // 9 ); // Add field to list list2.Fields.AddFieldAsXml(schemaXml); list2.Update(); // Change field display name var field = (SPBusinessDataField)list2.Fields.GetFieldByInternalName(fieldName); field.Title = fieldDisplay; field.Update(); // Add field to view var view = list2.DefaultView; view.ViewFields.Add(field); view.Update(); web.AllowUnsafeUpdates = false; // See SPLog class SPLog.WriteLog(SPLog.Category.Information, "AddBdcColumn > Campo agregado: " + fieldName); } } catch (Exception ex) { SPLog.WriteLog(SPLog.Category.Information, "AddBdcColumn > Exception: " + ex.Message); web.AllowUnsafeUpdates = false; return(false); } return(true); } } }