0

私のアプリケーションは、コード ファースト エンティティ フレームワークに基づいています。

モジュールと呼ばれるモデルがあります

public class Module
{
    public long Id { get; set; }
    public long ModuleTypeId { get; set; }
    public ModuleType ModuleType { get; set; }
    public string ModuleId { get; set; }
    public PropertyConfiguration PropertyConfiguration { get; set; }
    public DateTime DateEntered { get; set; }
}

そして、OwnedModule という別の Model クラス

public class OwnedModule
{
    public long Id { get; set; }
    public PropertyConfiguration PropertyConfiguration { get; set; }

    public long ModuleTypeId { get; set; }
    public ModuleType ModuleType { get; set; }
    public string ModuleId { get; set; }


    public Guid ModuleOwnerId { get; set; }
    public Module Module { get; set; }

    public DateTime Start { get; set; }
    public DateTime? End { get; set; }
}

アイデアは、新しいモジュールをシステムに追加したいときは、Module クラスを追加するだけで、OwnedModule は所有者を持っているか、私の誰かが所有しているものです。

したがって、基本的に OwnedModule には Module およびその他のプロパティが含まれます。ここに OwnedMODuleMap クラスがあります

public class OwnedModuleMap : EntityTypeConfiguration<OwnedModule>
{
    public OwnedModuleMap()
    {
        Property(x => x.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

        HasKey(x => x.Id);
        HasOptional(x => x.PropertyConfiguration).WithOptionalPrincipal().WillCascadeOnDelete();
        HasRequired(x => x.ModuleType).WithMany().HasForeignKey(x => x.ModuleTypeId);

        HasOptional(x => x.Module).WithOptionalDependent();
    }
}

モジュールを削除する必要がある場合は、まず OwnedModules テーブルから削除してから、Modules テーブルから削除する必要があります。所有者がいる場合。

私のリポジトリでは、これが私がやったことです:

     public void DeleteModule(long id)
    {
        var module = _dbSis.Modules.FirstOrDefault(t=>t.Id==id);
        DeleteOwnedModule(module.ModuleId);
        _dbSis.Entry(module).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

    public long GetOwnedModuleId(string moduleId)
    {
        var ownedModule= _dbSis.OwnedModules.FirstOrDefault(t => t.ModuleId == moduleId);
        if (ownedModule != null)
        {
            return ownedModule.Id;
        }
        return 0;
    }

    public void DeleteOwnedModule(string moduleId)
    {
        var ownedModuleId = GetOwnedModuleId(moduleId);
        var ownedModule = new OwnedModule
            {
                Id = ownedModuleId
            };
        _dbSis.Entry(ownedModule).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

しかし、現在、私の DeleteOwnedModule メソッドが機能していません。「なぜこれが起こっているのですか?」というエラーが表示されます。Delete ステートメントを機能させるには何が必要ですか?

同じキーを持つオブジェクトが ObjectStateManager に既に存在します。ObjectStateManager は、同じキーを持つ複数のオブジェクトを追跡できません。

PS: モジュールの追加中に所有者を設定しなければ、削除中に問題はありません。

  public void DeleteModule(long id)
    {
        var module = _dbSis.Modules.FirstOrDefault(t=>t.Id==id);
        //DeleteOwnedModule(module.ModuleId);
        _dbSis.Entry(module).State = EntityState.Deleted;
        _dbSis.SaveChanges();
    }

これは完全に機能します。手動で削除する場合は、データベースを開いて、最初にOwnedModulesテーブルから、次にModulesテーブルから必要なモジュールを削除できます。これも機能しますが、リポジトリのメソッドからの削除は機能しません

4

1 に答える 1

0

問題はこの方法です:

public void DeleteOwnedModule(string moduleId)
{
    var ownedModuleId = GetOwnedModuleId(moduleId);
    var ownedModule = new OwnedModule
        {
            Id = ownedModuleId
        };
    _dbSis.Entry(ownedModule).State = EntityState.Deleted;
    _dbSis.SaveChanges();
}

既存のものの をOwnedModule使用して新しいものを作成しています。idあなたがする必要があるのはFind、既存のモジュールであり、そのインスタンスの状態をに設定しますDeletedModuleメソッドで行うようにDeleteModule

public void DeleteOwnedModule(long id)
{
    var ownedModule = _dbSis.OwnedModules.FirstOrDefault(t=>t.Id==id);
    _dbSis.Entry(ownedModule).State = EntityState.Deleted;
    _dbSis.SaveChanges();
}

ちなみに、あなたは への呼び出しが多いですSaveChanges()。すべてのコードが機能するようになったら、 への呼び出しの数を減らすことを検討してくださいSaveChanges()

于 2013-07-26T10:02:56.700 に答える