Как поддержать локализацию путем сопоставления двух объектов одному POCO в EF 4 - PullRequest
2 голосов
/ 28 октября 2010

У меня есть эти простые сущности из таблиц БД alt text

Но я хочу, чтобы мои классы POCO были просто двумя классами:

public class Country
{
    public string ID { get; set; }

    public string Name { get; set; }

    public string LocalName { get; set; } // this localized

    public string Region { get; set; }

    public IEnumerable<City> Cities { get; set; }
}

public class City
{
    public int ID { get; set; }

    public string CountryID { get; set; }

    public string Name { get; set; } //this localized

    public double? Longitude { get; set; }

    public double? Latitude { get; set; }
}

Тогда яхочу, чтобы локализованные свойства "LocalName для Country и Name для City" были заполнены моим контекстом.

Так как сопоставить эти сущности с классами POCO?

И есть ли лучший способ сделать это?

Или я должен сделать ручное преобразование из сущностей в мою модель и добавить еще один уровень?

Пожалуйста, помогите мне принять решение.

.

: Дополнительная информация:

Я сделал ObjectContext на сделкус моим POCO, но когда я пытаюсь заполнить свое Дополнительное свойство "LocalName" в репозитории, я получаю эту ошибку:

The entity or complex type 'Site.Country'  cannot be constructed

в запросе LINQ to Entities.

и это метод в моем репозитории:

       public IQueryable<Country> GetCountries()
       {
           return from country in context.Countries
                  join countryCul in context.CountriesCultures 
                  on country.Code equals countryCul.CountryID
                  where countryCul.LangID == "en"
                  select new Country
                             {
                                 Code = country.Code,
                                 LocalName = countryCul.LocalName,
                                 Name = country.Name,
                                 Region = country.Region,
                             };
       }

Я не знаю, как заполнить свойство "LocalName" в операторе linq

1 Ответ

0 голосов
/ 30 октября 2010

Если вам нужно решение с классом ViewModel, вы можете выбрать следующее:

Для переноса City с выбранным LocalLanguage

public class CityLocolized
{
    public City City { get; set; }
    public String LocalName { get; set; }
}

Здесь мы выбрали любой вариант по умолчанию, поэтому с помощью ifиначе нет соединения, еще выбрал из таблицы CityCulture

string lang = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
List<CityLocolized> citiesLocalized = null;
if (lang == "en") // which is default in db
{
    citiesLocalized = (from c in fke.Cities
                    select new CityLocolized
                    {
                        City = c,
                        LocalName = c.Name
                    }
                    ).ToList();
}
else // for other languages 
{
    citiesLocalized = (from c in fke.Cities
                    join cc in fke.CityCultures
                    on c.Id equals cc.CityId
                    where cc.LangId == lang
                    select new CityLocolized
                    {
                        City = c,
                        LocalName = cc.LocalName
                    }).ToList();

}

и этот для прохождения Просмотр:

   ViewData["CitiesLocolized"] = new SelectList(citiesLocalized, "City.Id", "LocalName");

наконец-то на виду:

  <%:Html.DropDownListFor(model => model.CityId,  ViewData["CitiesLocolized"] as SelectList)%>

я думаю этоЭто так.

Могузальп

...