[英]Modify Model in MVC 5 EF5 after find function
从模型加载数据后,我需要自动在不是来自数据库的此类型的属性上插入信息。
例:
namespace project.Models
{
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;
public partial class MessageSource
{
public MessageSource()
{
this.messages = new HashSet<Message>();
}
public int id { get; set; }
public string category { get; set; }
public string message { get; set; }
public string message_translation { get; set; }
public virtual ICollection<Message> messages { get; set; }
}
}
id,category和message是数据库表的属性,message_translation是,在加载此模型后,始终需要自动将信息放入message_translation。 怎么样?
我这样做:
public partial class MessageSource
{
public MessageSource()
{
this.messages = new HashSet<Message>();
}
public int id { get; set; }
public string category { get; set; }
public string message { get; set; }
public string message_translation { get; set; }
public virtual ICollection<Message> messages { get; set; }
public string getTranslate()
{
if(message_translation == null)
{
Message msg = messages.FirstOrDefault(m => m.language.Equals(Translate.Instance.getLanguage()));
if(msg != null)
{
message_translation = msg.translation;
}
else
{
message_translation = String.Empty;
}
}
return message_translation;
}
}
效果不错
messageSource m = new messageSource();
var m2 = // query your db using sql or entity framework
然后
m.id= m2.id;
m.category= m.category;
m.message= m2.message
m.message_translation= "vvvvvvv whatever"//do add thing here
m.messages = m2.messages;
编辑:
另一种解决方案
Public class translation {
public int Id { get; set;}
public string language { get; set;}
public string text { get; set;}
}
然后,在删除message_translation之后,将以下内容添加到messageSource模型中
Public Icollection<translation> transMsg { get; set;}
现在假设您有一个味精可以翻译成13种语言; 那么ICollection<transMsg>
将有13个项目,我们只需要中文翻译
请执行以下操作:首先获取您的消息
var myMsg = dbContext.messageSources.Where(m=>m.id== 6).FirstOrDefault();
这将不会加载任何翻译bec。 我们没有使用Include()
,即延迟加载
但是,当我们想要翻译时,我们通过另一个Linq查询将其提取,如下所示:
var myMsgTranslation = myMsg.transMsgs.Where(t=>t.lang == "chinese").FirstOrDefault();
或者您按以下方式加载所有翻译
var myMsg = dbContext.messageSources.Where(m=>m.id== 6).Include(m=>m.msgTrans).FirstOrDefault();
在您的“查看”页面中,按如下所示提取默认语言
@html.textBoxFor(model=>model.msgTrans.Where(t=>t.lang == "chinese"))
声明:未经测试
希望对您有所帮助
public partial class MessageSource
{
private string _defaultLanguage;
public MessageSource(string defaultLang)
{
this.messages = new HashSet<Message>();
this._defaultLanguage = defaultLanguage ;
}
public int id { get; set; }
public string category { get; set; }
public string message { get; set; }
public string message_translation { get;
set{ value = getTranslation(_defaultLnag); }
public virtual ICollection<Message> messages { get; set; }
public string getTranslate(string lang)
{
var Translation = dbcontext.messages.Where(m=> m.Id == this.Id).FirstOrDefault().Translation.Where(t=>t.lang == lang).FirstOrDefault();
return Translation;
}
}
此解决方案假定您将翻译保存在链接到消息表的单独表中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.