私のアプリケーションは、コード ファースト エンティティ フレームワークに基づいています。
モジュールと呼ばれるモデルがあります
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テーブルから必要なモジュールを削除できます。これも機能しますが、リポジトリのメソッドからの削除は機能しません