rated by 0 users
This post has 1 Reply | 1 Follower

Top 500 Contributor
Male
Posts 2
Đinh Hồng Châu Posted: 08-21-2010 5:54 PM

Chào các bạn, mình hiện có 2 vấn đề thắc mắc về sử dụng LINQ khi lập trình C# như sau:
1. Sử dụng kế thừa trong LINQ như thế nào. Cụ thể là mình có 1 class cha, là BaseObject, chỉ có 2 thuộc tính ID và NAME. Sau đó có vài lớp con, ví dụ là Person và Company đều kế thừa lớp BaseObject trên. Vấn đề ở đây là khi mình tạo database thì không thể tạo riêng 1 table là BaseObject được, mà phải tạo cả 2 table Person và Company, trong đó mỗi bảng đều phải có 2 cột ID và NAME, rồi kéo cái database này vào Visual Studio để nó mapping ra 1 class LINQ to SQL, như vậy thì ko thấy tính kế thừa đâu nữa hết.

Mình cần xử lý vấn đề này, bởi vì trong tầng DataAccess, mỗi cái DAO của Person và Company đều có thao tác FindById và FindByName. Nếu cài đặt trong đó thì vừa duplicate code, lại mất thời gian, nên mình quyết định move ra 1 class riêng là DaoUtils với 2 hàm trên để đảm bảo tính abstract, hơn nữa mở rộng về sau cho tất cả những lớp con của BaseObject lại rất tiện lợi.

Mình gặp rắc rối là bởi vì một phần mình tạo database ở ngoài, rồi kéo vào Visual Studio để nó mapping ra 1 file dbml, dĩ nhiên là những table có ID và NAME thì nó sẽ generate ra các lớp có thuộc tính ID và NAME với các phương thức get, set  tương ứng. Nhưng những class đó, mình đều cho nó thừa kế từ 1 abstract superclass có sẵn ID và NAME rồi.

2. Tính đồng bộ giữa Visual Studio và SQL Server. Cụ thể là nếu trong project của mình, có 1 class A dạng LINQ to SQL (dbml) được mapping từ 1 file database là B.mdf. Sau đó mình dùng SQL Server để modify cái cấu trúc database B đó (thêm cột, thêm bảng), thì làm sao để Visual kịp thời cập nhật những thay đổi đó để chỉnh sửa lại cái file dbml trên cho phù hợp với hiện trạng? Chẳng nhẽ phải xóa file đó đi, kéo cái file database đó vô lại để nó mapping ra file dbml mới?

Mình vốn là lập trình viên Java, mới chuyển sang nghiên cứu LINQ nên những điểm trên không biết xử lý như thế nào. Rất mong được các bạn chỉ bảo. Xin chân thành cảm ơn.

Top 50 Contributor
Male
Posts 10

1-> Bạn thử cái này xem:

 

using System.Linq;
namespace DAC
{
    partial class DBContext
    {

    }
    public partial class Person : BaseObject
    {

    }


public partial class Company : BaseObject
    {

    }  

  public interface BaseObject
    {
        int Id { get; }
        string Name { get; }
    }
    public abstract class Respository<T>
         where T : BaseObject
    {
        public T GetById(int id)
        {
            return GetAll().SingleOrDefault(e => e.Id == id);
        }

        public T GetByName(string name)
        {
            return GetAll().SingleOrDefault(e => e.Name == name);
        }

        public abstract IQueryable<T> GetAll();
    }
    public class PersonRespository : Respository<HumanResource>
    {
        DBContext db = new DBContext();
        public override IQueryable<HumanResource> GetAll()
        {
            return db.HumanResources;
        }
    }


public class CompanyRespository : Respository<HumanResource>
    {
        DBContext db = new DBContext();
        public override IQueryable<HumanResource> GetAll()
        {
            return db.HumanResources;
        }
    }}

 

2-> Theo minh biết thì chỉ còn cách là kéo lại bảng để phát sinh lại code. Do vậy bạn không nên sửa trong file code phát sinh, vì sau khi phát sinh lại code bạn sẽ bị mất hết!

Page 1 of 1 (2 items) | RSS