Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Сопоставление связи базы данных (linq to sql)

Отношения данных, которые всегда останутся неизменными, можно закодировать в виде ссылок в классе сущностей. В учебной базе данных Northwind, всегда существует связь между заказчиками и их заказами, т.к. обычно заказчики размещают заказы.

LINQ to SQL определяет атрибут AssociationAttribute, с помощью которого представляются такие отношения. Этот атрибут используется совместно с типами EntitySet<TEntity> и EntityRef<TEntity> для представления в базе данных связи по внешнему ключу. 

Большинство связей имеют тип «один ко многим», как и в примере, представленном далее в этом разделе. Отношения "один-к-одному" и "многие-ко-многим" можно представить следующим образом.

  • Один к одному. Этот тип связей представляется включением элементов EntitySet<TEntity> с обеих сторон.

  • Многие ко многим. В связях типа «многие ко многим» первичный ключ связанной таблицы (называемой также таблицей соединения) часто формируется составлением внешних ключей из двух других таблиц.

В следующем примере отношения "один-ко-многим" класс Customer имеет свойство, объявляющее отношение между клиентами и их заказами. Свойство Orders имеет тип EntitySet<TEntity>. Этот тип указывает, что данное отношение относится к виду "один-ко-многим" (один клиент — много заказов). Свойство OtherKey используется для описания установки данной связи, а именно: путем указания в связанном классе имени свойства, которое будет сравниваться с существующим. В этом примере свойство CustomerID сравнивается таким образом, как если бы соединение базы данных сравнивалось с данным значением столбца.

[Table(Name = "Customers")]

public partial class Customer

{

[Column(IsPrimaryKey = true)]

public string CustomerID;

// ...

private EntitySet<Order> _Orders;

[Association(Storage = "_Orders", OtherKey = "CustomerID")]

public EntitySet<Order> Orders

{

get { return this._Orders; }

set { this._Orders.Assign(value); }

}

}

Возможна и обратная ситуация. Для описания ассоциации между клиентами и заказами вместо класса Customer можно использовать класс Order. Чтобы описать обратную связь с клиентом, класс Order использует тип EntityRef<TEntity>, как показано в следующем примере кода.

[Table(Name = "Orders")]

public class Order

{

[Column(IsPrimaryKey = true)]

public int OrderID;

[Column]

public string CustomerID;

private EntityRef<Customer> _Customer;

[Association(Storage = "_Customer", ThisKey = "CustomerID")]

public Customer Customer

{

get { return this._Customer.Entity; }

set { this._Customer.Entity = value; }

}

}

В следующем сегменте кода класс Order содержит свойство Customer, имеющее атрибут AssociationAttribute. Это свойство и его атрибут предоставляют класс Order с отношением для класса Customer.

[Association(Name="FK_Orders_Customers", Storage="_Customer", ThisKey="CustomerID", IsForeignKey=true)]

public Customer Customer

{

get

{

return this._Customer.Entity;

}

set

{

Customer previousValue = this._Customer.Entity;

if (((previousValue != value)

|| (this._Customer.HasLoadedOrAssignedValue == false)))

{

this.SendPropertyChanging();

if ((previousValue != null))

{

this._Customer.Entity = null;

previousValue.Orders.Remove(this);

}

this._Customer.Entity = value;

if ((value != null))

{

value.Orders.Add(this);

this._CustomerID = value.CustomerID;

}

else

{

this._CustomerID = default(string);

}

this.SendPropertyChanged("Customer");

}

}

}

В следующей таблице представлено описание свойств этого атрибута.

Свойство

Тип

По умолчанию

Описание

DeleteOnNull

Boolean

false

При задании данного свойства для ассоциации, в которой члены внешнего ключа не поддерживают значение NULL, удаляет объект при установке ассоциации значения NULL.

DeleteRule

String

Отсутствует

Добавляет в ассоциацию поведение удаления.

IsForeignKey

Boolean

false

При значении «true» назначает член в качестве внешнего ключа в ассоциации, представляющей связь базы данных.

IsUnique

Boolean

false

При значении «true» указывает ограничение уникальности для первичного ключа.

OtherKey

String

Идентификатор связанного класса

Назначает один или более членов целевого класса сущности в качестве ключевых значений на другой стороне ассоциации.

ThisKey

String

Идентификатор содержащего класса

Назначает элементы данного класса сущности, которые будут представлять ключевые значения на этой стороне ассоциации.