2012-12-14 3 views
1

WebMatrix 및 EntityFramework와 협력하고 있습니다. , exampl에 대한EntityFramework 속성 InverseProperty는 어떻게 작동합니까?

[Table("Users")] 
public class User 
{ 
    [Key] 
    public int UserId { get; set; } 

    [MaxLength(50), MinLength(5), Required] 
    public string UserName { get; set; } 

    [MaxLength(16), MinLength(8), Required] 
    public string Password { get; set; } 

    [MaxLength(50), Required] 
    public string Name{ get; set; } 

    [MaxLength(50), Required] 
    public string LasName1{ get; set; } 

    [MaxLength(50), Required] 
    public string LasName2{ get; set; } 

    public string token { get; set; } 

    public DateTime CreatedDateTime { get; set; } 

    public DateTime UpdatedDateTime { get; set; } 

    [InverseProperty("CreatedBy")] 
    public virtual ICollection<Device> CreatedDevices {get; set;} 

    [InverseProperty("UpdatedBy")] 
    public virtual ICollection<Device> UpdatedDevices {get; set;} 

    [InverseProperty("CreatedBy")] 
    public virtual ICollection<Cluster> CreatedClusters {get; set;} 

    [InverseProperty("UpdatedBy")] 
    public virtual ICollection<Cluster> UpdatedClusters {get; set;} 

    [InverseProperty("CreatedBy")] 
    public virtual ICollection<Region> CreatedRegions {get; set;} 

    [InverseProperty("UpdatedBy")] 
    public virtual ICollection<Region> UpdatedRegions {get; set;} 
} 

: 내 데이터베이스에서

나는 사용자 테이블은, 우리의 비즈니스 로직에서 사용자가 작성하거나 다른 테이블의 내용을 업데이트 할 수 있습니다, 그래서 내 모델에서 내 사용자 클래스는 다음과 같이이다 e 내 지역 클래스는 다음과 같습니다.

[Table("Regions")] 
public class Region 
{ 
    [Key] 
    public int RegionId { get; set; } 

    [MaxLength(50), MinLength(5), Required] 
    public string Name{ get; set; } 

    public virtual ICollection<Cluster> Clusters { get; set; } 

    public DateTime CreatedDateTime { get; set; } 

    public DateTime UpdatedDateTime { get; set; } 

    public Usuario CreatedBy { get; set; } 

    public Usuario UpdatedBy { get; set; } 
} 

이렇게하면 데이터베이스의 엔티티간에 필요한 관계가 만들어집니다. 이제 내 주된 의문이 생깁니다. 클러스터 테이블에 CreatedBy_UserId가 있습니다. 따라서 테이블의 항목을 삽입하거나 업데이트 할 때 User 객체를 전달해야합니까? 나는 이런 식으로 말하고있다

Cluster cluster = new Cluster() 
{ 
    RegionId = regionId, 
    CreatedDateTime = createdDateTime, 
    UpdatedDateTime = updatedDateTime, 
    CreatedBy = currentUser, 
    UpdatedBy = currentUser 
}; 

또는 외래 키를 나타내는 int를 테이블에 어떻게 전달합니까?

답변

1

모델에 외래 키 속성이없는 경우 네, 관계를 설정하기 위해 탐색 속성을 설정해야합니다. currentUser이 DB에서로드하거나 수동으로 첨부하여 컨텍스트에 연결되어 있는지 확인해야합니다. 그렇지 않으면 EF는 새로운 사용자를 생성합니다. 이 예이다

using (var context = new MyContext()) 
{ 
    context.Users.Attach(currentUser); 
    Cluster cluster = new Cluster() 
    { 
     RegionId = regionId, 
     CreatedDateTime = createdDateTime, 
     UpdatedDateTime = updatedDateTime, 
     CreatedBy = currentUser, 
     UpdatedBy = currentUser 
    }; 
    context.Clusters.Add(cluster); 
    context.SaveChanges(); 
} 

SaveChanges 세트 (currentUser.UserId 같음) 정확한 외부 키 값을 가진 INSERT 문을 생성한다.

+0

죄송합니다. EF에서 작업하기 시작했습니다. 어떤 상황에서 Attach 메서드를 사용해야합니까? Attach에 대한 호출이 제거되면 EF가 새로운 사용자를 만드는 이유는 무엇입니까? 또한 큰 문제는, 만약 내가 항목을 삭제했다면, 내 delete 메소드는 int id를 받고 다음과 같은 방식으로 엔트리를 쿼리한다.'Cluster cluster = (c.db.Clusters의 c에서, c.ClusterId == id select c) .FirstOrDefault();'그런 다음이 파일을 제거합니다. db.Clusters.Remove (cluster); db.SaveChanges();', Inverse Properties를 가지고 있다면 엔트리를 삭제하는이 접근 방식이 효과가 있습니까? –

+0

@UrielArvizu :'Attach'를 호출하면 엔티티가 이미 DB에 있음을 EF에 알립니다. (DB 로의 실제 왕복이없이 DB에서 엔티티를 로딩하는 것과 같은 효과가 있습니다.) '클러스터'에 대해 'Add'를 호출하면 EF는 클러스터 *와 모든 관련 엔티티 *가 첨부되어 있는지 확인합니다. 그렇지 않은 경우 관련 엔터티도 삽입해야한다고 가정합니다. 첨부 된 경우 FK가 기존 사용자 행에 설정됩니다. 클러스터 삭제 방법이 필요합니다. – Slauma

+0

EF와 관련하여 의문 사항이 있으면 감사드립니다. 나는 배우려고 노력 중이며 직접 답을 얻을 수 있다면 좋을 것입니다. 다시 한번 감사드립니다. –