0

私は休閑中のCRUDリポジトリを持っています:

public class CrudRepository<T> : ICrudRepository<T>
        where T : class, IUnique
    {
        static DataContext db = new DataContext();

        protected DataContext DataContext { get { return db; } }

        public virtual IQueryable<T> GetAll()
        {
            return db.GetTable<T>();
        }

        public virtual void Add(T item)
        {
            db.GetTable<T>().InsertOnSubmit(item);
        }

        public virtual void Save()
        {
            db.SubmitChanges();
        }

        public virtual T Get(int id)
        {
            return GetAll().FirstOrDefault(t => t.Id.Equals(id));
        }
    }

リポジトリ外のすべてのインスタンスに静的データコンテキストを使用します。外部キーエンティティを変更したいので、休憩ソリューションを試してみます。

CrudRepository<Employee> employeeRepository = new CrudRepository<Employee >();
Employee employee = employeeRepository.Get(employeeId)
employee.OfficeId = officeId;
employeeRepository.Save();

しかし、それは休眠例外をスローします:

ForeignKeyReferenceAlreadyHasValueException

だから私は2番目の解決策を休ませてみます:

CrudRepository<Employee> employeeRepository = new CrudRepository<Employee >();
Employee employee = employeeRepository.Get(employeeId)
employee.Office = new CrudRepository<Office>().Get(officeId);
employeeRepository.Save();

しかし、それは休眠メッセージで例外をスローします:

おそらく別のDataContextからロードされた、新しいものではないエンティティをアタッチまたは追加しようとしました

私に何ができる?何が問題ですか?

4

1 に答える 1

1

3つのことが私に飛びつきます。

employee.OfficeId = officeId; 

Employee クラスに OfficeId プロパティと Office プロパティがある場合、Office プロパティを使用して変更を行う必要があります。Office プロパティは、linq デザイナーの関係から自動生成されます。

代わりに ID ベースの操作を使用する場合は、デザイナーで従業員とオフィスの間の関係を削除します (注: これはデータベースを変更せず、コード ジェネレーターによって使用されるマッピングを変更するだけです)。

new CrudRepository<Employee >();  
new CrudRepository<Office>().Get(officeId); 

各 Crud リポジトリには独自のデータコンテキストがあります。異なるデータコンテキストからロードされたオブジェクトは混在できません。それらが混在することを許可されているとします。SubmitChanges を呼び出すと、どの DataContext が保存を担当するのでしょうか?

最終的に、これは、LinqToSql を引き続き使用したい場合、CrudRepository 実装から離れたいものになることを意味します。単一のクラスで Crud 操作をサポートしても、それほど役に立ちません。少なくともパススルー呼び出しのみであり、DataContext メソッドの直接呼び出しに簡単に置き換えることができます。

static DataContext db = new DataContext(); 

これはひどい。DataContext はスレッドセーフではありません。

于 2010-02-17T16:05:53.660 に答える