2013-04-22 46 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的外键为空。

同样,这是一个WCF DataService而不是vanilla EF,任何想法可能是什么错误?

干杯

+0

可以将下面的行添加到您的代码在for循环调用后添加方法 - _versionContext.AddLink(versionTreeEntry ,“PluginStates”,状态)。希望这可以帮助。 – Pratik 2013-04-22 18:18:54

+0

感谢Pratik。听起来像是对我的回答:) 我也可以用_versionContext.AddRelatedObject(versionTreeEntry,“PluginStates”,state)替换两行。 – Avram 2013-04-23 08:45:22

回答

1

在评论部分发布答案。

同意。要做到这一点,最好的方法是调用以下API:

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

感谢 PRATIK

相关问题