![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
База данных
Переходим к самому важному разделу, работе с БД. Например, у нас есть объект типа Post (блого-запись), которая, естественно, должна быть на двух языках:
Итак, как это всё будет организовано: · Создадим таблицу Language, где и будут определены языки · Создадим таблицу Post, где будут все поля, не требующие перевода · Создадим таблицу PostLang, связанную с Post и Language, где будет перевод необходимых полей для таблицы Post и связанный с таблицей Language Ок, теперь добавим это в LessonProject.Model (LessonProject.Model/IRepository.cs): #region Language
IQueryable< Language> Languages { get; }
bool CreateLanguage(Language instance);
bool UpdateLanguage(Language instance);
bool RemoveLanguage(int idLanguage);
#endregion
#region Post
IQueryable< Post> Posts { get; }
bool CreatePost(Post instance);
bool UpdatePost(Post instance);
bool RemovePost(int idPost);
#endregion Создаем модели с помощью уже созданных сниппетов /Proxy/Language.cs:
namespace LessonProject.Model { public partial class Language { } }
/Proxy/Post.cs: namespace LessonProject.Model { public partial class Post { } }
/SqlRepository/Language.cs: public partial class SqlRepository { public IQueryable< Language> Languages { get { return Db.Languages; } }
public bool CreateLanguage(Language instance) { if (instance.ID == 0) { Db.Languages.InsertOnSubmit(instance); Db.Languages.Context.SubmitChanges(); return true; }
return false; }
public bool UpdateLanguage(Language instance) { Language cache = Db.Languages.Where(p => p.ID == instance.ID).FirstOrDefault(); if (cache! = null) { cache.Code = instance.Code; cache.Name = instance.Name; Db.Languages.Context.SubmitChanges(); return true; }
return false; }
public bool RemoveLanguage(int idLanguage) { Language instance = Db.Languages.Where(p => p.ID == idLanguage).FirstOrDefault(); if (instance! = null) { Db.Languages.DeleteOnSubmit(instance); Db.Languages.Context.SubmitChanges(); return true; }
return false; }
} /SqlRepository/Post.cs: public partial class SqlRepository { public IQueryable< Post> Posts { get { return Db.Posts; } }
public bool CreatePost(Post instance) { if (instance.ID == 0) { Db.Posts.InsertOnSubmit(instance); Db.Posts.Context.SubmitChanges(); return true; }
return false; }
public bool UpdatePost(Post instance) { Post cache = Db.Posts.Where(p => p.ID == instance.ID).FirstOrDefault(); if (cache! = null) { //TODO: Update fields for Post Db.Posts.Context.SubmitChanges(); return true; }
return false; }
public bool RemovePost(int idPost) { Post instance = Db.Posts.Where(p => p.ID == idPost).FirstOrDefault(); if (instance! = null) { Db.Posts.DeleteOnSubmit(instance); Db.Posts.Context.SubmitChanges(); return true; }
return false; }
} Итак, у нас есть набор PostLangs в объекте класса Post, где и хранятся различные переводы. Причем, перевод на английский или русский язык может быть, так может и не быть. Но, по крайней мере, хотя бы один язык должен быть. Что необходимо сделать для этого: · Добавим языковые поля в Post (Header, Content) · Создадим свойство CurrentLang, при изменении которого будут инициализироваться языковые поля. · При создании записи в БД Post автоматически создается запись в БД PostLang. · При изменении записи в БД, проверяется, какой именно язык изменяется, и если такого языка (перевода) еще нет, то создается новая запись PostLang в БД: Перейдем к реализации (/Proxy/Post.cs): public partial class Post { private int _currentLang;
public int CurrentLang { get { return _currentLang; }
set { _currentLang = value;
var currentLang = PostLangs.FirstOrDefault(p => p.LanguageID == value); if (currentLang == null) { IsCorrectLang = false; var anyLang = PostLangs.FirstOrDefault(); if (anyLang! = null) { SetLang(anyLang); } } else { IsCorrectLang = true; SetLang(currentLang); } } }
private void SetLang(PostLang postLang) { Header = postLang.Header; Content = postLang.Content; }
public bool IsCorrectLang { get; protected set; }
public string Header { get; set; } public string Content { get; set; } } Тут важно заметить, что если необходимого перевода нет, то берется первый попавшийся, и устанавливается IsCorrectLang = false. Это для того, что лучше показать пользователю хоть какую-то информацию, чем не показать ничего. Создание/изменение объекта Post (/SqlRepository/Post.cs): public bool CreatePost(Post instance) { if (instance.ID == 0) { instance.AddedDate = DateTime.Now; Db.Posts.InsertOnSubmit(instance); Db.Posts.Context.SubmitChanges(); var lang = Db.Languages.FirstOrDefault(p => p.ID == instance.CurrentLang); if (lang! = null) { CreateOrChangePostLang(instance, null, lang); return true; } }
return false; }
public bool UpdatePost(Post instance) { Post cache = Db.Posts.Where(p => p.ID == instance.ID).FirstOrDefault(); if (cache! = null) { cache.Url = instance.Url; Db.Posts.Context.SubmitChanges();
var lang = Db.Languages.FirstOrDefault(p => p.ID == instance.CurrentLang); if (lang! = null) { CreateOrChangePostLang(instance, cache, lang); return true; } return true; }
return false; }
private void CreateOrChangePostLang(Post instance, Post cache, Language lang) { PostLang postLang = null; if (cache! = null) { postLang = Db.PostLangs.FirstOrDefault(p => p.PostID == cache.ID & & p.LanguageID == lang.ID); } if (postLang == null) { var newPostLang = new PostLang() { PostID = instance.ID, LanguageID = lang.ID, Header = instance.Header, Content = instance.Content, }; Db.PostLangs.InsertOnSubmit(newPostLang); } Else { postLang.Header = instance.Header; postLang.Content = instance.Content; } Db.PostLangs.Context.SubmitChanges(); } Рассмотрим, как работает CreateOrChangePostLang функция: · При вызове данной функции, мы ищем в Language необходимый язык. Если язык не найден, то вызова не происходит, и мы не создаем PostLang объект (т.е. перевод) · Если мы находим необходимый язык, то вызываем CreateOrChangePostLang: o Если cache нулевое (объект PostLang еще точно не создан) или o Если cache не нулевое, но перевод не найден, то § Создаем перевод (запись в БД PostLang) o Иначе изменяем перевод, который найден. При удалении записи Post все PostLang удаляются по связи OnDelete = cascade (проследите за этим) В БД должны быть уже добавлены записи для необходимых языков:
|