6

Tôi đang làm việc để thiết lập một dự án mới bằng cách sử dụng Mã đầu tiên cho khung thực thể 5 trong silverlight sử dụng dịch vụ RIA. Tôi đã tạo một dự án thử nghiệm do một số vấn đề tôi đã gặp phải và sẽ đăng mã bên dưới.Mã EF5 Dịch vụ đầu tiên và RIA Silverlight "Tham chiếu đối tượng không được đặt thành một thể hiện của đối tượng" lỗi xây dựng máy khách

Cụ thể, tôi nhận được một 'đối tượng tham chiếu không được đặt để một thể hiện của một đối tượng' lỗi bất cứ lúc nào tôi cố gắng để xây dựng dự án khách hàng Silverlight mà nên tạo ra các lớp proxy client.

Chỉ cần được rõ ràng, lỗi này không phải là trong khi chạy hoặc gỡ lỗi các ứng dụng, nhưng khi xây dựng nó.

Chúng tôi đã tách rằng điều này chỉ xảy ra nếu tôi có bất kỳ thuộc tính chuyển hướng/Keys nước ngoài được xác định trên lớp Mã đầu tiên của tôi.

Bất kỳ sự giúp đỡ tối nay sẽ được đánh giá rất nhiều.

public class Person 
{ 
    public int PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime? BirthDate { get; set; } 

    public virtual List<Character> Characters { get; set; } 
} 

public class Character 
{ 
    public int CharacterId { get; set; } 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
    public string CharacterName { get; set; } 
} 

public class CharacterDbContext : DbContext 
{ 
    public DbSet<Person> Persons { get; set; } 
    public DbSet<Character> Characters { get; set; } 

    public CharacterDbContext() 
    { 
     if (HttpContext.Current == null) 
     { 
      Database.SetInitializer<CharacterDbContext>(null); 
     } 
    } 
} 

[EnableClientAccess] 
public class CharacterDbService : DbDomainService<CharacterDbContext> 
{ 
    #region Basic Methods for Person with the context property of Persons 

    [Query] 
    public IQueryable<Person> GetPersons() 
    { 
     return DbContext.Persons; 
    } 

    [Insert] 
    public void InsertPerson(Person entity) 
    { 
     DbEntityEntry<Person> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Detached) 
     { 
      entityEntry.State = EntityState.Added; 
     } 
     else 
     { 
      DbContext.Persons.Add(entity); 
     } 
    } 

    [Update] 
    public void UpdatePerson(Person entity) 
    { 
     DbContext.Persons.AttachAsModified(entity, ChangeSet.GetOriginal(entity), DbContext); 
    } 

    [Delete] 
    public void DeletePerson(Person entity) 
    { 
     DbEntityEntry<Person> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Deleted) 
     { 
      entityEntry.State = EntityState.Deleted; 
     } 
     else 
     { 
      DbContext.Persons.Attach(entity); 
      DbContext.Persons.Remove(entity); 
     } 
    } 

    #endregion 

    #region Basic Methods for Character with the context property of Characters 

    [Query] 
    public IQueryable<Character> GetCharacters() 
    { 
     return DbContext.Characters; 
    } 

    [Insert] 
    public void InsertCharacter(Character entity) 
    { 
     DbEntityEntry<Character> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Detached) 
     { 
      entityEntry.State = EntityState.Added; 
     } 
     else 
     { 
      DbContext.Characters.Add(entity); 
     } 
    } 

    [Update] 
    public void UpdateCharacter(Character entity) 
    { 
     DbContext.Characters.AttachAsModified(entity, ChangeSet.GetOriginal(entity), DbContext); 
    } 

    [Delete] 
    public void DeleteCharacter(Character entity) 
    { 
     DbEntityEntry<Character> entityEntry = DbContext.Entry(entity); 
     if (entityEntry.State != EntityState.Deleted) 
     { 
      entityEntry.State = EntityState.Deleted; 
     } 
     else 
     { 
      DbContext.Characters.Attach(entity); 
      DbContext.Characters.Remove(entity); 
     } 
    } 

    #endregion 
} 
+0

dự án gì đang gây ra những rắc rối, các dự án Silverlight hoặc dự án EF de? Bạn cũng có thể xác minh rằng bạn không thiếu bất kỳ tệp nào và SL build không có liên kết WCF RIA Services của bạn –

+0

@Rikkos Đó là Dự án SL và nó được xây dựng tốt nếu tôi xóa tất cả các mối quan hệ tạo thành thực thể của tôi. Xem giải pháp từng phần bên dưới. Đó là một sự kết hợp của các vấn đề từ việc sử dụng TextTemplate trong bộ công cụ hợp nhất với các giải pháp khác mà tôi đã thử. – KitKat

Trả lời

6

Trường khóa ngoài của bạn không được ánh xạ, do đó máy phát mã proxy không thể diễn giải được (đoạn mã được gọi để xây dựng proxy của bạn trong khi biên dịch).
Bạn nên đặt ở bạn một cái gì đó DbContext như

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     modelBuilder.Entity<Character>() 
      .HasRequired(x=> x.Person) 
      .WithMany(x=> x.Characters) 
      .HasForeignKey(x=> x.PersonId); 
} 

cũng vậy, tôi đề nghị bạn thay đổi của bạn
public virtual List<Character> Characters { get; set; }
để
public virtual ICollection<Character> Characters { get; set; }, bởi vì tôi không chắc chắn nếu phát proxy (và EF quá) sẽ ánh xạ chính xác danh sách đó.
EDIT:
Tôi nghĩ rằng EF Metadataprovider không cung cấp thuộc tính chính xác trong mô tả.
Đặt một KeyAttribute qua Character.CharacterId và Person.PersonID, cũng có, thêm dòng này trên Character.Person

[Association("Character_Person", "PersonId", "PersonId", IsForeignKey = true)] 

và điều này qua Person.Characters

Association("Character_Person", "PersonId", "PersonId")]<br> 

EDIT:
Sau khi trò chuyện với KitKat, cuối cùng chúng tôi đã tìm thấy sự cố. Trong quá trình tạo proxy, một cuộc gọi đến Assembly.GetExportedTypes đã bị khiếu nại, nó cần EF 4.1. Simple đặt

<runtime> 
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
    <assemblyIdentity name="EntityFramework" publicKeyToken="b77a5c561934e089" culture="neutral" /> 
    <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" /> 
    </dependentAssembly> 
</assemblyBinding> 

trong cấu hình có liên quan đã làm thủ thuật

Lưu ý: ở bài viết trên blog này link ther của từ mỏ mà tốt hơn giải thích làm thế nào để đối phó với EF5 Mã đầu tiên và WCF Rịa Dịch vụ

+0

Cảm ơn bạn rất nhiều vì phản hồi của bạn, tuy nhiên tôi vẫn nhận được kết quả tương tự. Tôi đã trải qua các bước đó trong dự án thực tế của mình và không thử lại chúng trong bài kiểm tra cho đến khi đọc bài đăng của bạn. Sự hiểu biết của tôi là EF đã chọn các quy ước đặt tên. Nhưng sau khi xác định rõ ràng mối quan hệ tôi vẫn nhận được cùng một lỗi. Bất kỳ ý tưởng? – KitKat

+0

@KitKat Bạn được chào đón. mmm Tôi nghĩ rằng chiếc EF5 metadataprovider của bạn không đặt Hiệp hội cần thiết. Tôi sẽ chỉnh sửa câu trả lời của mình – mCasamento

+0

Tôi cũng đã thử điều này. Vẫn không đi. Kiểm tra các hội đồng microsoft trong trình duyệt đối tượng, tôi chỉ không nghĩ rằng phiên bản mới nhất nếu RIA Services hỗ trợ mã đầu tiên nữa. Tôi phải tải xuống gói Nu Get của bên thứ ba để thực hiện điều này. WCFRIA.EntityFramework – KitKat