0

내가 모델 여기 UserEntity Framework AddOrUpdate 메서드에서 복합 형식 속성을 식별자로 사용하려면 어떻게해야합니까? 내 응용 프로그램에서

public class User 
{ 
    private ICollection<User> friends; 
    private ICollection<Album> albums; 

    public User() 
    { 
     this.albums = new HashSet<Album>(); 
     this.friends = new HashSet<User>(); 
    } 

    public int Id { get; set; } 

    public UserInfo UserInfo { get; set; } 

    public int BornTownId { get; set; } 

    public Town BornTown { get; set; } 


    public int CurrentLivingTownId { get; set; } 

    public Town CurrentLivingTown { get; set; } 

    public virtual ICollection<User> Friends 
    { 
     get 
     { 
      return this.friends; 
     } 
     set 
     { 
      this.friends = value; 
     } 
    } 

    public virtual ICollection<Album> Albums 
    { 
     get 
     { 
      return this.albums; 
     } 
     set 
     { 
      this.albums = value; 
     } 
    } 
} 

을 가지고 UserInfo은 다음과 같습니다 복잡한 유형 :

[ComplexType] 
public class UserInfo 
{ 
    [Required] 
    [MaxLength(30)] 
    [MinLength(2)] 
    [Column("FirstName",TypeName = "varchar")] 
    public string FirstName { get; set; } 

    [Required] 
    [MaxLength(30)] 
    [MinLength(2)] 
    [Column("LastName", TypeName = "varchar")] 
    public string LastName { get; set; } 

    [NotMapped] 
    public string FullName => this.FirstName + " " + this.LastName; 

    [Required] 
    [MaxLength(30)] 
    [MinLength(4)] 
    [Column("Username", TypeName = "varchar")] 
    public string Username { get; set; } 

    [Required] 
    [MinLength(6)] 
    [MaxLength(50)] 
    [Column("Password", TypeName = "varchar")] 
    [PasswordValidation] 
    public string Password { get; set; } 

    [Required] 
    [Column("Email", TypeName = "varchar")] 
    [DataType(DataType.EmailAddress)] 
    [EmailValidation] 
    public string Email { get; set; } 

    [Column("RegisteredOn")] 
    public DateTime RegisteredOn { get; set; } 

    [Column("LastTimeLoggedIn")] 
    public DateTime LastTimeLoggedIn { get; set; } 

    [Range(1, 120)] 
    [Column("Age")] 
    public int Age { get; set; } 

    [Column("IsDeleted")] 
    public bool IsDeleted { get; set; } 
} 

내가 context.Users.AddOrUpdate(u => u.UserInfo.Username, user);으로 사용자 테이블에 대한 데이터를 씨앗을 시도, 다음과 같은 오류 메시지가 나타납니다.

Message=The properties expression 'u => u.UserInfo.Username' is not valid. The expression should represent a property: C#: 't => t.MyProperty'. 

내 퀘스트 이온 (문제의 대상만큼 복잡합니다) : UserInfo 클래스 또는 속성에 임의의 태그를 추가하거나 FluentApi을 사용하여 변경해야하고 올바른 태그 구조를 사용하여 AddOrUpdate에서 식별자로 u.UserInfo.Username을 사용하는 올바른 구문 방식은 무엇입니까? AddOrUpdate를 사용하는 적절한 방법을 시도하고 있습니다.

나는 Username을 UserInfo에서 꺼내 직접 User에 넣을 수 있다는 것을 알고 있지만, 좀 더 "광범위한"솔루션을 목표로합니다.

도움이 될 것입니다. 감사.

+0

AddorUpdate를 수행하지 않는다면 복잡한 유형의 속성에 대한 열을 EF로 만들 수 있습니까? – CodingYoshi

+0

@ 코딩 Yoshi EF는이 방법으로 AddOrUpdate를 처음 사용할 때 열을 추가하지만 값을 시드하지는 않으며 후속 시드에서 예외를 throw합니다.식별자없이 AddOrUpdate를 사용하면 제공된 값으로 테이블을 시드합니다. –

답변

0

유일한 해결책은 주어진 UserInfo.UsernameuserUsersDbSet에 있는지 먼저 확인하는 것입니다 InvalidOperationException이되는 "범인"System.Linq.Expressions.Expression<Func<User, object>> expression을 사용하십시오.

context.Users.AddOrUpdate(user); 

은 올바르게 값을 업데이트하므로 제대로 작동합니다. 복잡한 유형의 쿼리를 만들 수 있지만 데이터베이스 데이터를 업데이트하는 AddOrUpdate 확장 방법에서는 복합 유형을 사용할 수 없습니다.

0

이 방법을 사용하는 유일한 방법은 UserName 속성을 사용자 클래스로 이동하는 것입니다.

AddOrUpdate 제대로 실행하려면 대상 유형의 단순 속성을 전달하거나 둘 이상의 속성을 사용하여 항목을 일치시키려는 경우 익명 객체를 전달해야하지만, 둘 이상의 속성을 사용하여 항목을 일치시키려는 경우에는 익명 객체를 전달해야합니다. 다른 종류의 표현 기능이 있습니다.

그래서 User 클래스에 Username 속성을 선언하는 것이 좋습니다.

추가 조언 : 항상 복잡한 유형을 초기화 기억

public class User 
{ 
    private ICollection<User> friends; 
    private ICollection<Album> albums; 

    public User() 
    { 
     this.albums = new HashSet<Album>(); 
     this.friends = new HashSet<User>(); 

     //Good practice: always initialize your complex type properties 
     UserInfo = new UserInfo(); 
    } 

    //the rest of your class members here 
} 

희망이 도움이! 그리고하지 않는 params TEntity[] entities 과부하로 AddOrUpdate를 사용

var user = context.Users.FirstOrDefault(u => u.UserInfo.Username == username) 
           ?? new User 
           { 
            UserInfo = new UserInfo() 
            { 
             FirstName = firstName, 
             LastName = lastName, 
             Username = username, 
             Password = password, 
             Email = email, 
             RegisteredOn = registeredOnDate.AddDays(2), 
             LastTimeLoggedIn = lastDateLoggedOn.AddDays(10), 
             IsDeleted = isDeleted 
            } 
           }; 

: 내가 UserUsername를 전송하지 않고 생각할 수있는

+0

조언 해 주셔서 감사합니다. 나는 복잡한 유형이 필요하다는 것을 알고 있지만 UserInfo 내부에 필요한 속성을 가지고있어 어쨌든 ArgumentNullException을 얻을 것이다. –