Číst v angličtině

Sdílet prostřednictvím


Přizpůsobení operací pomocí uložených procedur

Uložené procedury představují běžný přístup k přepsání výchozího chování. Příklady v tomto tématu ukazují, jak můžete použít vygenerované obálky metod pro uložené procedury a jak můžete volat uložené procedury přímo.

Pokud používáte Visual Studio, můžete pomocí Návrhář relací objektů přiřadit uložené procedury k provádění vkládání, aktualizací a odstraňování.

Poznámka

Pokud chcete číst hodnoty generované databází, použijte výstupní parametry v uložených procedurách. Pokud nemůžete použít výstupní parametry, zapište částečnou implementaci metody namísto spoléhání na přepsání vygenerované Návrhář relací objektů. Členové namapovaní na hodnoty vygenerované databází musí být po úspěšném dokončení operací UPDATE nastaveni na odpovídající hodnotyINSERT. Další informace najdete v tématu Odpovědnosti vývojáře při přepsání výchozího chování.

Příklad 1

V následujícím příkladu předpokládejme, že Northwind třída obsahuje dvě metody volání uložených procedur, které se používají pro přepsání v odvozené třídě.

[Function()]
public IEnumerable<Order> CustomerOrders(
    [Parameter(Name = "CustomerID", DbType = "NChar(5)")]
    string customerID)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
        ((MethodInfo)(MethodInfo.GetCurrentMethod())),
        customerID);
    return ((IEnumerable<Order>)(result.ReturnValue));
}

[Function()]
public IEnumerable<Customer> CustomerById(
    [Parameter(Name = "CustomerID", DbType = "NChar(5)")]
    string customerID)
{
    IExecuteResult result = this.ExecuteMethodCall(this,
        ((MethodInfo)(MethodInfo.GetCurrentMethod())),
        customerID);
    return (IEnumerable<Customer>)(result.ReturnValue);
}

Příklad 2

Následující třída používá tyto metody pro přepsání.

public class NorthwindThroughSprocs : Northwind
{

    public NorthwindThroughSprocs(string connection) :
        base(connection)
    {
    }

    // Override loading of Customer.Orders by using method wrapper.
    private IEnumerable<Order> LoadOrders(Customer customer)
    {
        return this.CustomerOrders(customer.CustomerID);
    }
    // Override loading of Order.Customer by using method wrapper.
    private Customer LoadCustomer(Order order)
    {
        return this.CustomerById(order.CustomerID).Single();
    }
    // Override INSERT operation on Customer by calling the
    // stored procedure directly.
    private void InsertCustomer(Customer customer)
    {
        // Call the INSERT stored procedure directly.
        this.ExecuteCommand("exec sp_insert_customer …");
    }
    // The UPDATE override works similarly, that is, by
    // calling the stored procedure directly.
    private void UpdateCustomer(Customer original, Customer current)
    {
        // Call the UPDATE stored procedure by using current
        // and original values.
        this.ExecuteCommand("exec sp_update_customer …");
    }
    // The DELETE override works similarly.
    private void DeleteCustomer(Customer customer)
    {
        // Call the DELETE stored procedure directly.
        this.ExecuteCommand("exec sp_delete_customer …");
    }
}

Příklad 3

Můžete použít NorthwindThroughSprocs přesně tak, jak byste použili Northwnd.

NorthwindThroughSprocs db = new NorthwindThroughSprocs("");
var custQuery =
    from cust in db.Customers
    where cust.City == "London"
    select cust;

foreach (Customer custObj in custQuery)
    // deferred loading of cust.Orders uses the override LoadOrders.
    foreach (Order ord in custObj.Orders)
        // ...
        // Make some changes to customers/orders.
        // Overrides for Customer are called during the execution of the
        // following:
        db.SubmitChanges();

Viz také