2010-04-30 1 views
1

Linq와 Sql 및 MVC Model Binder 문제가 다시 발생합니다.ASP.NET MVC 2 : Linq와 ForeignKey 관계 및 기본 ModelBinder 낯선

는 SQL을 그들에게 설명하기 위해 클래스를 생성에 내가 Linq에있는 그들은이에 유사 :

public class Client 
{ 
    public int ClientID { get; set; } 
    public string Name { get; set; } 
} 

public class Site 
{ 
    public int SiteID { get; set; } 
    public string Name { get; set; } 
} 

public class User 
{ 
    public int UserID { get; set; } 
    public string Name { get; set; } 
    public int? ClientID { get; set; } 
    public EntityRef<Client> Client { get; set; } 
    public int? SiteID { get; set; } 
    public EntityRef<Site> Site { get; set; } 
} 

'사용자'는 '클라이언트'와 '사이트 과 관계가있다. 관리자 사용자는 클라이언트 또는 사이트에 바인딩되어 있지 않으므로 User 클래스에는 nullable ClientID 및 SiteID가 있습니다.

이제 사용자가 '사용자'개체를 편집 할 수있는보기가 있으며보기에는 모든 '사용자'속성에 대한 필드가 있습니다. 양식이 제출되면, appropiate '저장'조치를 내 UserController에서 호출됩니다 여기

public ActionResult Save(User user, FormCollection form) 
{ 
    //form['SiteID'] == 1 
    //user.SiteID == 1 

    //form['ClientID'] == 1 
    //user.ClientID == null 
} 

문제가 된 ClientID가 설정되지 않습니다 즉,이 값이 FormCollection의 경우에도, 항상 null입니다.

무엇이 잘못되었는지 알아보기 위해 나는 Linkq to Sql 디자이너 생성 클래스에서 ClientID와 SiteID getters 및 setter에 대한 중단 점을 설정합니다. 다음과 같은 것으로 나타났습니다. SiteID가 설정되고 ClientID가 설정되었지만 Client EntityRef 속성이 null 값으로 설정되고 차례로 ClientID가 null로 설정됩니다. 나는 왜 그리고 무엇이 Client 속성을 설정하려고하는지 알지 못한다. 왜냐하면 Site 속성 setter가 결코 호출되지 않기 때문에 Client setter 만 호출되고 있기 때문이다.

수동으로이 같은 FormCollection에서 클라이언트 ID를 설정 :

user.ClientID = int.Parse(form["ClientID"].ToString()); 

는 'ForeignKeyReferenceAlreadyHasValueException'가 발생, 이미 이전에 null로 설정 되었기 때문에. 내가 발견 한 유일한 해결 방법은 사용자 정의 메서드로 생성 된 부분 사용자 클래스를 확장하는 것입니다.

Client = default(EntityRef<Client>) 

그러나 이것은 만족스러운 해결책이 아닙니다. 이런 식으로 생각하지 않아?

제발 누군가 나를 계몽하십시오. 지금까지 SQL에 Linq는 나를 미치게합니다! 난 그냥 MVC 3과 동일한 문제로 실행했습니다

안부

답변

1

나는 그것을 만드는 동안 모델 바인더 모델 클래스의 모든 공용 속성을 설정하기 때문에 이런 일이 발생 생각합니다. 따라서 user.ClientID1으로 설정하고 user.Clientnull (양식 모음에 없기 때문에)으로 설정합니다. 그 후 user.ClientID의 값은 null이됩니다.
그래서 당신은 다음과 같은 바인딩에서 User 클래스의 Client 속성을 제외해야합니다

public ActionResult Save([Bind(Exclude="Client")]User user, FormCollection form) 

이 나를 위해 일했다.