2013-04-22 4 views
0

내가 가진 및 데이터 서비스를 통해 노출 엔티티 프레임 워크 프로젝트에 연관된 객체를 추가 할 수 없습니다 :제대로 엔티티 프레임 워크 컨텍스트

public class VersionContext : DbContext 
{ 
    public DbSet<VersionTreeEntry> VersionTreeEntries { get; set; } 

    public DbSet<PluginState> PluginStates { get; set; } 

    public static void SetForUpdates() 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<VersionContext, Configuration>()); 
    } 
} 

public class VersionTreeEntry 
{ 
    public VersionTreeEntry() 
    { 
     Children = new List<VersionTreeEntry>(); 
     PluginStates = new List<PluginState>(); 
    } 

    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public virtual ICollection<VersionTreeEntry> Children { get; set; } 

    public virtual ICollection<PluginState> PluginStates { get; set; } 

    public virtual VersionTreeEntry Ancestor { get; set; } 

    /// <summary> 
    /// Links to the ProtoBufDataItem Id for the session state. 
    /// </summary> 
    public int DataId { get; set; } 

    public string Notes { get; set; } 

    [Required] 
    public DateTime TimeStamp { get; set; } 

    [MinLength(1, ErrorMessage = "Tag cannot have a zero length")] 
    [MaxLength(20, ErrorMessage = "A tag name cannot contain over 20 characters")] 
    public string Tag { get; set; } 

    public bool IsUiNodeExpanded { get; set; } 

    [Required] 
    public string Version { get; set; } 

    [Required] 
    public string SessionName { get; set; } 
} 

public class PluginState 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public string PluginName { get; set; } 

    [Required] 
    public byte[] Data { get; set; } 
} 

를 지금까지 내가, 데이터 클래스가 올바르게 정의되어 볼 수 있습니다. 나는 그대로의 관계로, 새로운 객체를 생성하고 컨텍스트에 추가하려고 :

var session = new Session(); 
session.SessionName = "My new session"; 

VersionTreeEntry versionTreeEntry = new VersionTreeEntry(); 
versionTreeEntry.SessionName = session.SessionName; 
versionTreeEntry.Version = Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
versionTreeEntry.TimeStamp = DateTime.Now; 

_versionContext.AddToVersionTreeEntries(versionTreeEntry); 

foreach (var plugin in session.Plugins) 
{ 
    using (var ms = new MemoryStream()) 
    { 
      plugin.SaveState(ms); 
      PluginState state = new PluginState(); 
      state.PluginName = plugin.PluginName; 
      state.Data = ms.ToArray(); 

      versionTreeEntry.PluginStates.Add(state); 
    } 
} 

_versionContext.SaveChanges(); 

문제는 PluginState 인스턴스가 실제로 데이터베이스에 추가 만나지 것입니다. 컨텍스트에 수동으로 추가하는 코드를 추가하면 추가되지만, VersionTreeEntry를 가리키는 외래 키는 null입니다.

다시 말하지만, 이것은 바닐라 EF가 아닌 WCF DataService입니다. 잘못된 생각일까요?

건배

+0

당신이 방법을 추가하기 위해 호출 후 forloop에 코드에 다음 줄을 추가 할 수 있습니다 :이 작업을 수행하는 가장 좋은 방법은 다음과 같은 API를 호출하는 것입니다 , "PluginStates", 주). 희망이 도움이됩니다. – Pratik

+0

감사합니다. 나에게 대답처럼 들리네. 또한 양쪽 줄을 _versionContext.AddRelatedObject (versionTreeEntry, "PluginStates", state)로 바꿀 수 있습니다. – Avram

답변

1

답글을 여기에서 덧글 섹션에서 게시하십시오.

동의. - (_versionContext.AddLink versionTreeEntry

_versionContext.AddRelatedObject(versionTreeEntry, "PluginStates", state); 

감사 Pratik