This post has been migrated from www.experimentsincode.com, we apologise if some of the images or content is missing
public class SqlServerDataProvider : Sitecore.Data.SqlServer.SqlServerDataProvider { public SqlServerDataProvider(string connectionString) : base(connectionString) { } protected override void LoadItemFields(string itemCondition, string fieldCondition, object[] parameters, Sitecore.Collections.SafeDictionary prefetchData) { base.LoadItemFields(itemCondition, fieldCondition, parameters, prefetchData); //set the default language to use Language defaultLang; Language.TryParse("en", out defaultLang); //full list of languages the site uses LanguageCollection coll = this.GetLanguages(); foreach (var data in prefetchData) { if (data.Value != null) { var uris = data.Value.GetVersionUris(); //check the item contains the default language before doing anything if (uris.Cast().Any(x => x.Language == defaultLang)) { //get the default language fields var defaultUri = uris.Cast().First(x => x.Language == defaultLang); //loop through each language foreach (Language lang in coll) { //check if language doesn't exist if (!uris.Cast().Any(x => x.Language == lang)) { //update language with default language values FieldList fields = data.Value.GetFieldList("en", defaultUri.Version.Number); foreach (var key in fields.GetFieldIDs()) { data.Value.AddField(lang.Name, 1, key, fields[key]); } } } } } } } }The main difference is the change in the for loop. In Sitecore 5.3.x the GetFieldsList method returned a collection of field objects that had two properties, the Key which was the field name and a Value property. This has been replaced with an object that wraps a HashList of ID's and Values. This makes more sense since field names could be change and break code but ID's will be consistent.
FieldList fields = data.Value.GetFieldList("en", defaultUri.Version.Number); foreach (var key in fields.GetFieldIDs()) { data.Value.AddField(lang.Name, 1, key, fields[key]); }The XML describing the data provider in the web.config has also changed, add the provider detailed below:
<dataproviders> <main type="Sitecore.Data.$(database).$(database)DataProvider, Sitecore.Kernel"> <param connectionstringname="$(1)"> <name>$(1)</name> </main> <web type="Demo.Sitecore.SqlServerDataProvider, Demo"> <param connectionstringname="$(1)"> <name>$(1)</name> </web> </dataproviders>Then alter the provider used by the database from:
<database id="web" singleinstance="true" type="Sitecore.Data.Database, Sitecore.Kernel"> <param desc="name">$(id) <icon>Network/16x16/earth.png</icon> <securityenabled>true</securityenabled> <dataproviders hint="list:AddDataProvider"> <dataprovider ref="dataProviders/main" param1="$(id)"> </dataprovider></dataproviders></database>An update the the provider to:
<param desc="name">$(id)  <icon>Network/16x16/earth.png</icon>  <securityenabled>true</securityenabled>  <dataproviders hint="list:AddDataProvider">    <dataprovider ref="dataProviders/web" param1="$(id)"> </dataprovider> </dataproviders>