在查找函数后修改MVC 5 EF5中的模型

本文关键字:EF5 模型 MVC 查找 函数 修改 | 更新日期: 2023-09-27 17:53:56

我需要在从模型加载数据后,自动插入非来自数据库的此类属性的信息。

示例:

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是DB表属性,message_translation没有,加载这个模型后,我总是需要在message_translate中自动放入信息。怎样

在查找函数后修改MVC 5 EF5中的模型

我这样做:

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;
    }
}

效果良好

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;
 }
}

该解决方案假设您将翻译保存在一个单独的表中,该表链接到消息表

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"))

说明:未测试

希望对有所帮助