0

私のコードは、WillCascadeOnDelete(true) を追加するまで問題なく動作しました。

例外: InvalidOperationException - データベースの作成は成功しましたが、データベース オブジェクトの作成は成功しませんでした。詳細については、内部例外を参照してください。

内部例外: System.Data.SqlServerCe.SqlCeException - 参照関係により、許可されていない循環参照が発生します。[ 制約名 = User_AdministratorOf_Target ]

最小限の再現 (新しい MVC3 Web アプリ プロジェクト内):

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;

public class User
{
    [Key]
    public string UserName { get; set; }
    public virtual ICollection<Document> Documents { get; set; }
    public virtual ICollection<Document> AdministratorOf { get; set; }
}

public class Document
{
    public int Id { get; set; }
    public User Owner { get; set; }
    public ICollection<User> Administrators{ get; set; }
}

public class EntityMappingContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Document> Documents { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(x => x.AdministratorOf)
            .WithMany(x => x.Administrators)
            .Map(x =>
            {
                x.MapLeftKey("UserName");
                x.MapRightKey("Document");
                x.ToTable("DocumentAdministrators");
            });
        modelBuilder.Entity<Document>()
            .HasRequired(x => x.Owner)
            .WithMany(x => x.Documents)
            .WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);
    }

}

もちろん、connectionStrings の下の web.config に SQL 接続文字列を追加する必要もあります。

<add name="EntityMappingContext" connectionString="Data Source=|DataDirectory|Error.sdf" providerName="System.Data.SqlServerCe.4.0"/>

1 対多の関係が既に存在する場合、削除時にカスケードを有効にすると循環関係がどのように作成されますか? カスケード削除にサイクルがあるということですか? 指定した唯一のカスケードが User -> Document の場合、どうすればよいですか? どうすれば修正できますか?ありがとう!

4

1 に答える 1

0

カスケード削除エラーは必ずしも循環関係によるものではありませんが、削除ツリー内の同じテーブルへの複数の参照を持つことによって、この投稿を参照してください。

トリガーは削除です:

  • ユーザー -> ドキュメント -> DocumentAdministrator
  • ユーザー -> DocumentAdministrator。

ユーザーを削除すると、多対多テーブルの削除が 2 回トリガーされ、エラーが発生します。ビジネス ロジックで所有者に属するすべてのドキュメントを削除する方がよい場合があります。

于 2012-08-12T20:16:44.350 に答える