0

私は LINQ to SQL の新しいユーザーであり、使用に問題があります。私はLINQ to SQL Designerを使用し、DBテーブルにマッピングされたクラスを作成しました。特に、voice という名前のクラスが 1 つあります。

[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.voce")]
public partial class voce : INotifyPropertyChanging, INotifyPropertyChanged
{

    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

    private int _id_voce;

    ... other private fields;



    private int _category;

    private EntityRef<category> _category1;
            public voce()
    {
        this._riepilogo = new EntitySet<riepilogo>(new Action<riepilogo>(this.attach_riepilogo), new Action<riepilogo>(this.detach_riepilogo));
        this._hera = default(EntityRef<hera>);
        this._category1 = default(EntityRef<category>);
        OnCreated();
    }

    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_id_voce", AutoSync=AutoSync.OnInsert, DbType="Int NOT NULL IDENTITY", IsPrimaryKey=true, IsDbGenerated=true)]
    public int id_voce
    {
        get
        {
            return this._id_voce;
        }
        set
        {
            if ((this._id_voce != value))
            {
                this.Onid_voceChanging(value);
                this.SendPropertyChanging();
                this._id_voce = value;
                this.SendPropertyChanged("id_voce");
                this.Onid_voceChanged();
            }
        }
    }

    ......
    [global::System.Data.Linq.Mapping.ColumnAttribute(Storage="_category", DbType="Int NOT NULL")]
    public int category
    {
        get
        {
            return this._category;
        }
        set
        {
            if ((this._category != value))
            {
                if (this._category1.HasLoadedOrAssignedValue)
                {
                    throw new System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException();
                }
                this.OncategoryChanging(value);
                this.SendPropertyChanging();
                this._category = value;
                this.SendPropertyChanged("category");
                this.OncategoryChanged();
            }
        }
    }

ご覧のとおり、voce クラスには、category という名前のテーブルを参照する category という名前のフィールドがあります。

データベースに新しい音声を追加するときは、新しい音声インスタンスを作成し、DataContext を使用して次のように追加します。

voce v = new voce(){...field, category1 = //create or retrieve category};

具体的には、カテゴリ フィールドが既に存在する場合は DB から取得され、存在しない場合は音声を挿入する前に挿入されます。

問題は、データベースに音声を追加するときです。

datacontext.InsertOnSubmit(v);
datacontext.SubmitChanges();

カテゴリを再度挿入し、一意の制約で失敗します。

ネストされたすべてのオブジェクトを追加せずに音声を追加するにはどうすればよいですか?

ありがとう、そして私の下手な英語でごめんなさい。

4

1 に答える 1

0
internal category GetCategoryFromDescription (string desc, Utility.VOICE_MODALITY mode)
    {
        bool type = mode == Utility.VOICE_MODALITY.ENTRATA ? true : false;
        var query = from cat in dc.category
                    where cat.description == desc && cat.type == type
                    select cat;

        if (query.Count() == 0)
        {
            category newC =  new category() { description = desc };
            dc.category.InsertOnSubmit(newC);
            dc.SubmitChanges();
            return newC;
        }
        else
            return query.Single();

    }
于 2013-01-23T09:09:21.790 に答える