2008-09-17 38 views
7

Tôi có được khái niệm về việc tạo ra một đối tượng kinh doanh hoặc thực thể để đại diện cho một cái gì đó giống như một người. Sau đó tôi có thể tuần tự hóa một người bằng DTO và gửi nó cho khách hàng. Nếu khách hàng thay đổi đối tượng, nó có thể có một lá cờ IsDirty trên đó vì vậy khi nó được gửi trở lại máy chủ tôi biết để cập nhật nó.Cách theo dõi thay đổi đối tượng kinh doanh?

Nhưng nếu tôi có đối tượng Đơn hàng thì sao? Điều này có tiêu đề chính informaton, khách hàng, nhà cung cấp, ngày yêu cầu, vv Sau đó, nó có OrderItems mà là một danh sách < OrderItem>, là các mục được đặt hàng. Tôi muốn có thể sử dụng đối tượng kinh doanh này trên giao diện người dùng của mình. Vì vậy, tôi có một số textboxes nối với vị trí, nhà cung cấp, ngày yêu cầu, vv và một mạng lưới nối với OrderItems. Kể từ khi OrderItems là một danh sách tôi có thể dễ dàng thêm và xóa các bản ghi vào nó. Nhưng làm thế nào để tôi theo dõi điều này, đặc biệt là các mục đã xóa. Tôi không muốn các mục đã xóa hiển thị trong lưới của mình và tôi không thể lặp lại chúng nếu tôi sử dụng foreach, vì chúng đã bị xóa. Nhưng tôi vẫn cần phải theo dõi thực tế đã có một sự xóa bỏ. Làm cách nào để theo dõi các thay đổi. Tôi nghĩ tôi cần sử dụng một đơn vị công việc? Nhưng sau đó mã dường như trở nên khá phức tạp. Vì vậy, sau đó tôi tự hỏi tại sao không chỉ đơn giản là sử dụng DataTables và nhận được sự theo dõi thay đổi miễn phí? Nhưng sau đó tôi đọc cách đối tượng kinh doanh là con đường để đi.

Tôi đã tìm thấy các ví dụ khác nhau về ví dụ đơn giản về Person, bnut không phải là ví dụ chi tiết tiêu đề như Đơn đặt hàng.

BTW sử dụng C# 3.5 cho việc này.

Trả lời

-1

đối tượng dữ liệu không theo dõi thay đổi. theo dõi thay đổi xảy ra trên DataContext và các đối tượng mà bạn đã truy xuất thông qua DataContext. Vì vậy, để theo dõi những thay đổi bạn cần phải làm như sau:

public class FooDataContext : DataContext 
{ 
    public Table<Order> Orders; 
} 

public class Order 
{ 
     [DbColumn(Identity = true)] 
     [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey = true, IsDbGenerated = true)] 
     public int Id { get; set; } 

     [DbColumn(Default = "(getutcdate())")] 
     [Column(DbType = "DateTime", CanBeNull = false, IsDbGenerated = true)] 
     public DateTime DateCreated { get; set; } 

     [Column(DbType = "varchar(50)", CanBeNull = false, IsDbGenerated = false)] 
     public string Name { get; set; } 
} 

Bây giờ trong codebehind của bạn, bạn có thể làm điều gì đó như:

public void UpdateOrder(int id, string name) 
{ 
    FooDataContext db = new FooDataContext(); 
    Order order = db.Orders.Where(o=>o.Id == id).FirstOrDefault(); 

    if (order == null) return; 

    order.Name = name; 

    db.SubmitChanges(); 
} 

tôi sẽ không khuyên bạn nên trực tiếp sử dụng bối cảnh dữ liệu trong các mã đằng sau, nhưng đây là một cách hay để bắt đầu với LINQ to SQL. Tôi sẽ khuyên bạn nên đặt tất cả các tương tác cơ sở dữ liệu của bạn trong một dự án bên ngoài và gọi từ GUI đến các lớp đóng gói hành vi này.

Tôi khuyên bạn nên tạo tệp Linq To Sql (dbml) nếu bạn mới sử dụng LINQ to Sql.

Nhấp chuột phải vào dự án của bạn trong trình khám phá giải pháp và chọn Thêm mục mới. Chọn tệp LINQ to SQL và sau đó nó sẽ cho phép bạn kết nối với cơ sở dữ liệu của bạn và chọn các bảng.

Sau đó, bạn có thể xem mã được tạo và nhận một số ý tưởng tuyệt vời về cách hoạt động của LINQ to Sql và bạn có thể làm gì với nó.

Sử dụng đó như là một hướng dẫn về làm việc với LINQ to SQL và điều đó sẽ đưa bạn xa ...

+0

cách thoát khỏi chủ đề !! –

6

Thứ nhất, bạn có thể sử dụng một khuôn khổ hiện có nhằm giải quyết những vấn đề này, như CSLA.NET. Tác giả của khuôn khổ này đã giải quyết những vấn đề này. Hãy truy cập http://www.rockfordlhotka.net/cslanet/ cho việc này. Ngay cả khi bạn không sử dụng khung làm việc đầy đủ, các khái niệm vẫn có thể áp dụng được.

Nếu bạn muốn cuộn của riêng bạn, những gì tôi đã làm trong quá khứ là thay vì sử dụng Danh sách cho bộ sưu tập của tôi, tôi đã sử dụng một loại tùy chỉnh bắt nguồn từ BindingList. Thừa kế từ BindingList cho phép bạn ghi đè hành vi của việc thêm/xóa mục. Vì vậy, bạn có thể ví dụ có một bộ sưu tập nội bộ của "delteted" mục. Mỗi khi phương thức Remove overriden được gọi trên bộ sưu tập của bạn, hãy đặt mục đó vào bộ sưu tập "đã xóa", và sau đó gọi thực hiện cơ sở của phương thức Remove. Bạn có thể làm tương tự cho các mục đã thêm hoặc các mục đã thay đổi.

2

Bạn đang tìm hiểu về việc cần một đơn vị công việc nhưng không viết. Sử dụng NHibernate hoặc một số ORM khác. Đó là những gì họ đang làm cho. Họ có Unit of Works được xây dựng.

Đối tượng kinh doanh thực sự là "cách để đi" cho hầu hết các ứng dụng. Bạn đang lặn vào một khu vực sâu và sẽ có nhiều việc phải làm. Nhìn vào DDD.

Tôi cũng khuyên bạn nên chống lại mã như vậy trong mã của bạn. Nhìn vào mẫu MVP.

Tôi cũng muốn (trong khi tôi đang bận học nhiều thứ mới, rất quan trọng), hãy xem xét RẮN.

Bạn có thể muốn xem JP Boodhoo không có gì ngoài khóa học .net vì nó bao gồm rất nhiều thứ này.

Các vấn đề liên quan