2015-01-06 2 views
1

주어진 MAC 주소의 존재 여부에 따라 새 행을 만들거나 MACReg 모델의 기존 행을 업데이트하는 follow 함수가 있습니다.C# LINQ 쿼리가 의도하지 않은 새 행을 만듭니다.

public Boolean RegisterMAC(string pwd, string mac, string location) 
{ 
    School school = getSchoolByCode(pwd); 
    if (school == null) 
    { 
     return false; 
    } 
    //initial register or update 
    using (CloudPrintDbContext db = new CloudPrintDbContext()) 
    { 
     MACReg r = db.MACRegs.Find(mac); 
     if (r == null) //create new row 
     { 
      MACReg m = new MACReg { MAC = mac, Location = location, 
       School = school, RegTime = DateTime.Now, UpdateTime = DateTime.Now }; 
      db.MACRegs.Add(m); 
     } 
     else //update location 
     { 
      r.School = school; 
      r.Location = location; 
      r.UpdateTime = DateTime.Now; 
     } 
     db.SaveChanges(); 
    } 
    return true; 
} 

그러나, 문제는 항상 모델 School에 새 행 (하지 MACReg)를 생성한다는 것이다. 왜 그런가? 감사! MACReg과 학교에 대한

모델은 다음과 같습니다 :

public class MACReg 
{ 
    [Key] 
    public string MAC { set; get; } 

    [Required] 
    public School School { set; get; } 

    [Required] 
    public string Location { set; get; } 

    [Required] 
    public DateTime UpdateTime { set; get; } 

    [Required] 
    public DateTime RegTime { set; get; } 
} 

public class School 
{ 
    [Key] 
    public int SchoolID { set; get; } 

    [Required] 
    public string SchoolName { set; get; } 

    [Required] 
    public DateTime CreateTime { set; get; } 

    [Required] 
    public DateTime PwdExprTime { set; get; } 

    [Required] 
    public byte[] PwdHash { set; get; } 

    [Required] 
    public byte[] Salt { set; get; } 
} 

UPDATE : getSchoolByCode는

private School getSchoolByCode(string pwd) 
{ 
    using (CloudPrintDbContext db = new CloudPrintDbContext()) 
    { 
     foreach(School s in db.Schools.Where(s => s.PwdExprTime > DateTime.Now)){ 
      byte[] userH = HashUtils.GenerateHash_Salt(pwd, s.Salt); 
      if (HashUtils.CompareByteArrays(userH, s.PwdHash)) 
      { 
       return s; 
      } 
     } 
    } 
    return null; 
} 
+0

디버깅하는 경우 r의 값은 무엇입니까? –

+0

'학교'는 어디에서 왔습니까? 'db' 컨텍스트의 범위 밖에서 올 수있는 것처럼 보입니다. 또한 LINQ와 관련이 없습니다 (지금까지). – Rawling

+1

@ L-Three r은 Mac이있을 때 db의 행을 나타내는 객체입니다. – totoro

답변

4

아래에 귀하의 school 그렇게는 using 문에서 db 인스턴스에 의해 추적 아니에요 다른 CloudPrintDbContext에서입니다 . 다른 DbContext에 연결되어 있지 않은 경우 School을 설정하기 전에 해당 어댑터를 연결할 수 있습니다. AS를

db.Schools.Attach(school); 

옆으로 난 당신이 동적 프록시를 사용할 수 있도록 EF documentation에 따라, 대신 newDbSet.Create() 방법을 사용하는 것이 좋습니다 것입니다.

+0

감사합니다! '학교 '인스턴스가'RegisterMAC'에서 인식되지 않으므로 다시 생성됩니까? 또한 'MacReg r = db.MACRegs.Find (mac) '전에 RegisterMAC에'db.Schools.Attach (school)'을 넣으려는 것입니까? 'mac'을 어디에 부착할까요? 먼저 'MACReg'의 인스턴스를 '찾기'해야합니다. 맞습니까? – totoro

+0

@dragon_cat 죄송합니다. MAC이 문자열이라는 것을 보았습니다. 그것이 또 다른 존재라고 생각했습니다. – kjbartel

+0

@dragon_cat EF는 '학교'가 기존 주체라는 것을 모릅니다. 따라서 새로운 학교라고 생각합니다. 'db.MACRegs.Add (m)'을 호출하면'school'도 추가됩니다. – kjbartel

관련 문제