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 です。何が問題なのですか?

乾杯

4

1 に答える 1

1

コメント欄からここに答えを投稿します。

同意した。これを行う最善の方法は、次の API を呼び出すことです。

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

ありがとうプラティック

于 2013-04-25T12:28:41.033 に答える