如何使用Entity Framework为CRUD编写LINQ查询?

时间:2015-05-15 23:01:55

标签: c# asp.net linq entity-framework

我使用EntityFramework(EF V6)和Asp.Net创建一个网站,我已经创建了.edmx和.tt以及DBContext。

我试图为每个表创建一个对象,以便稍后用aspx召唤它

我不知道我是否以正确的方式编写了我的LINQ查询!这就是为什么我需要你的帮助。

表格我试图在这张图片中为它建立一个LINQ对象:

enter image description here

我创建的这个对象类:

public class LINQSubjects 
{
    NewsPaperEntities ctx = new NewsPaperEntities();
    // Get Subject
    public Subject GetSubject(int SubjectID)
    {
        Subject sub = ctx.Subjects.FirstOrDefault(s=> s.Subject_ID==SubjectID);
        return sub;
    }
    // Get All Subject Info
    public List<Subject> GetAllSubjects()
    {
        List<Subject> sublist = (from s in ctx.Subjects select s).ToList<Subject>();
        return sublist;
    }
    // Insert a Subject
    public void AddSubject(Subject Addsub)
    {
        ctx.Subjects.Add(Addsub);
        ctx.SaveChanges();
    }
    // Delete a Subject
    public void DeleteSubject(int SubjectID)
    {
        Subject sub = ctx.Subjects.FirstOrDefault(s => s.Subject_ID == SubjectID);
        ctx.Subjects.Remove(sub);
        ctx.SaveChanges();
    }
    // Edit a Subject
    public void UpdateSubject(Subject Newsub)
    {
        Subject Oldsub = ctx.Subjects.FirstOrDefault(s => s.Subject_ID == Newsub.Subject_ID);
        Oldsub = Newsub;

        ctx.SaveChanges();
    }
}

是对还是错?

2 个答案:

答案 0 :(得分:3)

这是我要改变的唯一方法,其余的看起来正确。

<强>更新

    public List<Subject> GetAllSubjects()
    {
        List<Subject> sublist = ctx.Subjects.ToList();
        return sublist;
    }
    public void DeleteSubject(int SubjectID)
    {
        Subject sub = ctx.Subjects.FirstOrDefault(s => s.Subject_ID == SubjectID);

        if(sub!=null)//FirstorDefault can return null
        {
           ctx.Subjects.Remove(sub);
           ctx.SaveChanges();
        }
    }
    //This is with the assumption that the parameter Newsub is attached to the context already. 
    //As in you got the sub from the context then changed it then passed it into UpdateSubject
    public void UpdateSubject(Subject Newsub)
    {
        Subject Oldsub = ctx.Subjects.FirstOrDefault(s => s.Subject_ID == Newsub.Subject_ID);
        if(Oldsub !=null)//FirstorDefault can return null
        {                
            Oldsub = Newsub;
            //If Newsub is not attached you have to set manually set each property.
            //i.e.Oldsub.Name = Newsub.Name;
            ctx.SaveChanges();
        }
    }

答案 1 :(得分:1)

我建议您将逻辑更改为使用块中的新上下文,而不是引用共享上下文。 EF Context的生活:

using(var ctx = new NewsPaperEntities())
{
    ctx.Subjects.Add(Addsub);
    ctx.SaveChanges();
}
  

以下是决定生命周期的一般指导原则   上下文:

     
      
  • 使用长时间运行的上下文时,请考虑以下事项:   
        
    • 当您将更多对象及其引用加载到内存中时,内存   消费的背景可能会迅速增加。这可能会导致   表现问题。
    •   
    • 请记住处理上下文   不再需要。
    •   
    • 如果异常导致上下文出现在   不可恢复的状态,整个申请可能会终止。
    •   
    • 遇到与并发相关的问题的可能性随着差距的增加而增加   在查询和更新数据的时间之间增长。
    •   
  •   
  • 使用Web应用程序时,请按请求使用上下文实例。
  •   
  • 使用Windows Presentation Foundation(WPF)或Windows窗体时,请为每个窗体使用上下文实例。这使您可以使用上下文提供的更改跟踪功能。
  •   

参考:https://msdn.microsoft.com/en-us/data/jj729737.aspx?f=255&MSPPError=-2147217396