2013-11-04 3 views
0

초보자 용 질문. 다음을 감안할 때 :정적 객체 및 시드 데이터 (EF 코드 우선)

 public static Tenant Www = new Tenant() { TenantId = 1, Name = "www", Urls = new string[]{"https://app.com"}}; 

매개 변수가 정의 된 개체에 대한 참조가 있습니다. 이 경우이 값을 가진 객체가 데이터베이스에 있다고 가정합니까? 내 종자 방법에서 임차인이 추가 Url 포함

if (context.Tenants.FirstOrDefault(s => s.Name == "Www") == null) { 
      context.Tenants.Add(new Tenant() { 
       TenantId = 1, 
       Name = "Www", 
       Urls = new string[]{"https://app.com", "http://localhost"} 
      }); 
     } 

참고 :

내 종자 방법은 다음을 포함합니다. Tenant.Www을 통해 쿼리 할 때 어떤 버전이 사용되는지 혼란 스럽습니다.

obj.TenantId = Tenant.Www.TenantId과 같은 것을 통해 정적 방법을 사용하는 경우 ID 만 사용되지만 어떤 경우에는 obj.Tenants.push(Tenant.Www)과 같은 작업을 수행 할 수 있습니까? 어느 것이 사용 되었습니까? 그리고 그 이유는 무엇입니까?

답변

2

는이 값으로 개체가 데이터베이스

아니, Tenant 클래스의 바로 인스턴스의 존재한다고 가정한다. 주어진 코드 줄에서이 객체의 지속성에 대해서는 아무 것도 없습니다. Name"Www"에 해당하는 Tenant를 얻을하려고합니다

귀하의 Seed 방법을 통해 조회 할 때

내가 사용됩니다 버전에 대한 혼란 스러워요. 이러한 레코드가 데이터베이스에서 발견되면 EF는 새로운 Tenant 개체를 구체화하고 해당 속성을 데이터베이스의 값으로 채 웁니다. CLR의 시점에서 Tenant.Www이 새로 구체화 된 오브젝트는 다른 오브젝트가됩니다. 즉,

context.Tenants.FirstOrDefault(s => s.Name == "Www") != Tenant.Www 

하나를 사용, 왜됩니다 무엇입니까?

다시, obj != Tenant.Www.
EF에는 마법이 없습니다. 엔티티 유형의 생성자를 호출하면 새 객체를 만듭니다. EF 컨텍스트는 Add/Attach 메쏘드를 통해 그들에 대해 알릴 때까지 객체에 대해 아무것도 모릅니다.

업데이트.

Tenant 인스턴스를 기본값으로 사용하려면 다음을 입력하십시오. 1) 정적 인스턴스를 버리십시오. 2) 기본 인스턴스 검색 기준을 정의합니다 (예 : Name == "Www"). 3)이 기본 인스턴스가 필요할 때 위에 정의 된 기준에 따라 데이터베이스에서 쿼리합니다.

+0

감사합니다. 만약 내가 단지 지름길을 위해서 static 클래스를 사용하려고한다면, TenantId가 정의 된 Tenant의 인스턴스를 정의하는 것이 안전 할 것이므로 Tenant.Www.TenantId를 통해 항상 관계를 할당 할 수 있습니까? 아니면 FirstOrDefault 쿼리를 항상 안전하게 수행하도록 제안 하시겠습니까? – SB2055

+0

질문의 문맥에서 "안전"을 정의하십시오. 이 정적 인스턴스에서 무엇을 원합니까? – Dennis

+0

내 ID 정의 접근 방식으로 push (Tenant.Www) 또는 Add (Tenant.Www)와 같은 작업을 수행해야하는 경우 비어 있거나 오래된 Tenant 개체를 할당하는 것을 두려워 할 것입니다. 예 : 정적 Tenant.Www가 정의 된 ID 만 가지고 있고 Add() 연산에 사용한다고 가정합니다. EF가 정확히 일치하는 항목을 찾을 수 없기 때문에 다른 Tenant가 생성됩니까? 또는 EF가 PK에만 관심이 있기 때문에 일치하는 ID로 시드()로부터 임차인을 사용할 것입니까? – SB2055

관련 문제