1

最初に EF 4.3 コードを使用して m:n 関係を作成および/または保存する際に問題があります

したがって、最初のエンティティPublicationは、他の内部スカラー プロパティと同じように定義されます。

    public class Publication : IDataErrorInfo{

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int PublicationId { get; set; }

    [InverseProperty("Publications")]
    public virtual ICollection<Group> Groups { get; set; }

同じ方法で他のクラス:

    public class Group : IDataErrorInfo {

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int GroupId { get; set; }

    [InverseProperty("Groups")]
    public ICollection<Publication> Publications { get; set; }

多くの記事によると、これは問題ないはずです。

私が発生するいくつかの問題があります。初めに:

  • 新しいパブリケーションを作成し、それをいくつかのグループでアサートするとします。すべてがデータベースに保存されます。しかし、プログラムを再起動すると、同じ特定のパブリケーションで ICollection が null に設定されています。したがって、グループとの関係に関する情報は削除されました。理由はわかりません:(
  • グループ関係を持つ既存のパブリケーション エントリを更新しようとすると、次のテキストで DBUpdateException がスローされます。

リレーションシップの外部キー プロパティを公開しないエンティティの保存中にエラーが発生しました。単一のエンティティを例外のソースとして識別できないため、EntityEntries プロパティは null を返します。保存中の例外の処理は、エンティティ タイプで外部キー プロパティを公開することで簡単に行うことができます

内部例外は同じで、これの内部例外は次のとおりです。

PRIMARY KEY 制約 'PK_ Publicat _3AF5D6A10AD2A005' に違反しています。オブジェクト 'dbo.PublicationGroups' に重複するキーを挿入できません。ステートメントは終了されました。

私は、出版物の新しい価値を次のように主張しています。

var entry = db.Publications.First(a => a.PublicationId == publKey);
entry.Groups = db.Groups.
                Where(a => groupKeys.Contains(a.GroupId)).
                Select(b => b).
                ToList();

ここpublKeyで、 は編集されたエンティティgroupKeysのキ​​ーであり、関連するパブリケーションである GroupId のリストです。

例外を呼び出しdb.SaveContext()た後、スローされます

このトピックは数多くの記事で取り上げられてきましたが、解決策は見つかりませんでした。すべての例は同じコードを使用していますが、明らかに何かが欠けています。永続データ ストレージとして SQL Ce 4.0 を使用しています。

回答ありがとうございます。昨日から対処していますが、なぜこれが起こるのかはわかりません

4

1 に答える 1

0

グループをデータベースに追加した後、.Save を呼び出していますか? そうしないと、グループをパブリケーションに追加しようとしても、実際にはまだ DbSet に含まれていません。次のコードは私にとってはうまくいきます-おそらく、それがあなたのものとどのように違うのかを明確にすることができますか?

public class Publication
{
    public int PublicationId { get; set; }
    public string PublicationName { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
}

public class Group
{
    public int GroupId { get; set; }
    public string GroupName { get; set; }
    public ICollection<Publication> Publications { get; set; }
}

public class Context : DbContext
{
    public DbSet<Publication> Publications { get; set; }
    public DbSet<Group> Groups { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        Database.DefaultConnectionFactory = new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0");
        Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Context>());

        Context context = new Context();

        // Only add the groups if it's a new database
        if (!context.Groups.Any())
        {
            context.Groups.Add(new Group { GroupName = "Group 1" });
            context.Groups.Add(new Group { GroupName = "Group 2" });
            context.SaveChanges();
        }

        if (context.Publications.Any())
        {
            Console.WriteLine("At startup, P1 is in groups " + String.Join(", ", context.Publications.First().Groups.Select(g => g.GroupName)));
        }

        // Add publication
        Publication p;
        p = new Publication();
        p.Groups = context.Groups.ToList();     // Add to all existing groups
        context.Publications.Add(p);
        context.SaveChanges();

        Console.WriteLine("P1 is in groups " + String.Join(", ", context.Publications.First().Groups.Select(g => g.GroupName)));
    }
}

(SqlCe プロバイダーを使用するようにコードが更新されました)

于 2012-05-19T08:49:50.790 に答える