Linq2SQL で 1 対 0 または 1 の関係を作成することは可能ですか?
私の理解では、1 対 1 の関係を作成するには、各テーブルの PK で FK 関係を作成します。
しかし、PK を null 可能にすることはできないため、1 対 0 または 1 の関係を機能させる方法がわかりません。
私はデザイナーを使用してモデルを自動的に作成しています。そのため、カスタム ORM コードではなく、SQL テーブルを設定して関係を誘導する方法を知りたいと思います。
Linq2SQL で 1 対 0 または 1 の関係を作成することは可能ですか?
私の理解では、1 対 1 の関係を作成するには、各テーブルの PK で FK 関係を作成します。
しかし、PK を null 可能にすることはできないため、1 対 0 または 1 の関係を機能させる方法がわかりません。
私はデザイナーを使用してモデルを自動的に作成しています。そのため、カスタム ORM コードではなく、SQL テーブルを設定して関係を誘導する方法を知りたいと思います。
あなたは部分的に正しいです...しかし、あなたの混合物は少しです。
主キー フィールドを null にすることはできません。その部分は正しいです。ただし、1 -> 0 または 1 の関係を保持するオブジェクトの外部キー フィールドは null になる可能性があります。
LINQ to SQL では、one -> zero または one の関係は、別の LINQ to SQL クラスを参照するが null を許可する単なるフィールドになります。
例の表
create table Child (
id int identity(1,1),
name varchar(max),
primary key (id))
create table Parent (
id int identity(1,1),
childId int,
name varchar(max),
primary key (id),
foreign key (childId) references Child(id))
これらのテーブルを使用して、親から子への 1 -> ゼロまたは 1 つと、子から親への 1 -> 多を取得する必要があります (1 つの子は複数の親を持つことができます)。
Z カーディナリティが必要な場合は、次のようにしてください。
CREATE TABLE parent (id INTEGER NOT NULL PRIMARY KEY);
CREATE TABLE child (id INTEGER NOT NULL PRIMARY KEY REFERENCES parent (id));
2 つのテーブル間に共通の主キーを作成しています。PK が親に存在しない場合、子に行を挿入することはできません。
SELECT p.*, c.* FROM parent p LEFT JOIN child c ON c.id=p.id
関係が存在しない c.* に対しては NULL を返します。