Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
122
Добавлен:
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

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

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

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.