1

//件名情報へのaddWebUIがあり、これらのデータは。という名前のeditSQLServerdeleteデータベーステーブルに保存されていますSubject。そのテーブルには、、、などの列がありId(PK)ます。SubjectCodeSubjectNameTutor

Idフィールドは主キーであり、常に一意です。

SubjectCodevarchar一意である必要があるフィールドです(などの値CS1001

LINQデータを挿入および更新するときに、以下のように(C#)を使用して一意性を検証しました。

bool isCodeExist = DbContext.Subject.Any(record => record.SubjectCode == subject.SubjectCode);

if (true == isCodeExist )
{
    // SubjectCode is already exist. Do not proceed.
    return -1;
}
else
{
    // Proceed...
}

これは、インサートに対してのみ正常に機能します。

サブジェクトのチューター名(または他の列)のみを更新するなど、更新時にエラーが発生する場合があります。これについてのあなたの助けに感謝します。

UPDATE:更新操作の完全なコードセクション。

    public int EditSubject(Subject subject)
    {
        using (SMSEntities DbContext= new SMSEntities())
        {
            try
            {                    
                bool isCodeExist = DbContext.Subject.Any(record => record.SubjectCode == subject.SubjectCode);


                if (true == isCodeExist )
                {
                     // SubjectCode is already exist. Do not proceed.
                     return -1;
                }
                else
                {
                    // Create table object 
                    Subject theSubject = new Subject();

                    // Assign values from the domain entity obj from param
                    theSubject.SubjectCode = subject.SubjectCode;
                    theSubject.Tutor = subject.Tutor;       
                    theSubject.LastUpdatedDate = DateTime.Now;
                    // other value assignment also same....

                    // Save subject
                    DbContext.Subjects.Attach(theSubject);
                    DbContext.ObjectStateManager.ChangeObjectState(theSubject, EntityState.Modified);
                    DbContext.SaveChanges();

                    return 0;
                }
            }                
            catch (Exception)
            {
                // Log exception
                throw;
            }
        }
    }
4

1 に答える 1

3

更新のみの場合は、述語でIDも確認する必要があります。次のようになります。

bool isCodeExist = DbContext.Subject.Any(record => 
                                         record.SubjectCode == subject.SubjectCode &&
                                         record.Id != subject.Id);

アップデート:

しかし、それがUpdateOrInsertの場合:

public int EditSubject(Subject subject)
{
    using (SMSEntities DbContext= new SMSEntities())
    {
        try
           {                    
            var theSubject = DbContext.Subject.SingelOrDefault(record => record.SubjectCode == subject.SubjectCode);

            if (theSubject != null)
            {
                 // A subject with the same SubjectCode exists.
                 if(existingSubject.Id != Subject.Id)
                 {
                     //It's another subject.
                     return -1;
                 }// else it's the same Subject so we may want to update it.
            }
            else //Subject does not exist.
            {
                // Create table object 
                theSubject = new Subject();
            }
            // Assign values from the domain entity obj from param
            theSubject.SubjectCode = subject.SubjectCode;
            theSubject.Tutor = subject.Tutor;       
            theSubject.LastUpdatedDate = DateTime.Now;
            // other value assignment also same....

            // Save subject
            DbContext.Subjects.Attach(theSubject);
            DbContext.ObjectStateManager.ChangeObjectState(theSubject, EntityState.Modified);
            DbContext.SaveChanges();

            return 0;
        }                
        catch (Exception)
        {
            // Log exception
            throw;
        }
    }
}

それが役に立ったかどうか教えてください。

于 2013-01-20T12:26:24.833 に答える