8

Chúng tôi đã sử dụng EF 4.0 với phương pháp tiếp cận cơ sở dữ liệu đầu tiên sử dụng mô hình .edmx.Ảnh hưởng đến cách các lớp thực thể được tạo trong EF 6 mã đầu tiên từ cơ sở dữ liệu

Hiện chúng tôi đang nâng cấp lên EF 6.1.3 và chúng tôi đang điều tra xem có nên đi cùng hoặc không có mô hình đó .edmx. Chúng tôi chắc chắn vẫn muốn kiểm soát lược đồ cơ sở dữ liệu của mình - vì vậy chúng tôi sẽ tạo các bảng mới, v.v. với kịch bản SQL và sau đó tạo mô hình EF (hoặc .edmx hoặc chỉ các lớp mã) từ cơ sở dữ liệu hiện có.

Trong các thử nghiệm của tôi với Visual Studio 2013, tôi nhận thấy một điểm gây phiền nhiễu khi EF 6 tạo các lớp từ cơ sở dữ liệu hiện có. Tôi có một lớp học Customer liên kết với một lớp học Contact ba lần - một lần cho số DesignContact, một lần cho số SalesContact và lần thứ ba cho số SupportContact. Chúng được lưu trữ dưới dạng các cột DesignContactId (INT) v.v. trong bảng Customer.

Bạn có thể tạo ra những lớp học sử dụng này T-SQL:

CREATE TABLE dbo.Contact 
(
    ContactID INT NOT NULL 
     CONSTRAINT PK_Contact PRIMARY KEY CLUSTERED, 
    Name VARCHAR(200), 
    Address VARCHAR(200), 
    ZipCode VARCHAR(20), 
    City VARCHAR(100), 
    Phone VARCHAR(100) 
) 

CREATE TABLE dbo.Customer 
(
    CustomerID INT NOT NULL 
     CONSTRAINT PK_Customer PRIMARY KEY CLUSTERED, 
    Name VARCHAR(200), 
    -- other properties 
    DesignContactID INT 
     CONSTRAINT FK_Customer_DesignContact 
      FOREIGN KEY REFERENCES dbo.Contact(ContactID), 
    SalesContactID INT 
     CONSTRAINT FK_Customer_SalesContact 
      FOREIGN KEY REFERENCES dbo.Contact(ContactID), 
    SupportContactID INT 
     CONSTRAINT FK_Customer_SupportContact 
      FOREIGN KEY REFERENCES dbo.Contact(ContactID), 
) 

Khi tạo các lớp từ cơ sở dữ liệu, tôi thấy điều này:

  • lớp Customer có ba xxxContactId cột của tôi như là lĩnh vực - đó là như mong đợi
  • EF cũng tạo ra ba thuộc tính điều hướng của loại Contact - nhưng nó gọi chúng là Contact, Contact1, Contact2 - uuuuuggghHHHH!

Tôi đang cố gắng để tìm một cách để có được xung quanh những đặc tính chuyển hướng tên khủng khiếp xấu ..... đây là xấu bởi vì:

  • không trực quan của họ - mà một trong những điểm mà tiếp xúc với doanh nghiệp ?
  • là "ổn định" hoặc chúng có thể thay đổi theo thời gian không, nếu mối quan hệ thứ tư với Contact được giới thiệu? Không chắc ..... (không thể tìm thấy bất kỳ tài liệu nào về điều này)
  • chỉ tên của chúng hoàn toàn khủng khiếp ...... tại sao chúng không được gọi là DesignContact (dựa trên DesignContactId), SalesContact (dựa trên SalesContactId) vv?

Trong EF 4.1 trở lên, bạn có thể thêm mẫu T4 vào .edmx và ảnh hưởng đến quá trình tạo - vẫn có thể bằng EF6, nếu bạn đang làm "Tạo mã đầu tiên từ cơ sở dữ liệu hiện có" tiếp cận? Tôi không thể tìm thấy bài đăng hoặc bài đăng trên blog về chủ đề đó nữa .....

Hoặc có cách nào khác để ảnh hưởng đến cách EF tạo ra các lớp học hay không - đặc biệt là các thuộc tính điều hướng? Tôi có thể định nghĩa một số loại quy ước tùy chỉnh hay cái gì đó để gây ảnh hưởng đến điều này không?

+1

@JulieLerman: bất kỳ suy nghĩ về vấn đề này (như _Queen của EF_ :-)?) –

+0

@RowanMiller: bất kỳ ý tưởng hay thủ thuật nào lên tay áo của bạn để xử lý điều này? –

+0

Có thể áp dụng: http://stackoverflow.com/a/13064383/1207195? (không được bỏ phiếu là lừa bởi búa) –

Trả lời

0

Nhờ mọi người sứt mẻ trong - tôi đã cố gắng tiếp cận khác nhau:

  • Tôi đã thử các dự án "EF Xếp Poco" trên CodePlex nhưng không hoàn toàn hài lòng với điều đó chút nào

  • Tôi đã thử EF Power Tools cho EF 6 - và nó hoạt động tốt. Điều này cho phép tôi thêm các mẫu T4 ảnh hưởng đến quá trình tạo mã. Công trình - nhưng thách thức bây giờ là hiểu mô hình đối tượng đang được sử dụng làm cơ sở cho việc tạo mã (mà dường như không có giấy tờ ....)

  • Tôi đã thử gói 01GGNuGet - hoạt động quá, khá độc đáo, nhưng có những vấn đề tương tự như Power Tools - để thực sự thay đổi bất cứ điều gì, rất nhiều đào sâu vào mô hình đối tượng sẽ là cần thiết

0

Bạn có thể thay đổi cài đặt cho các lớp được tạo trong tệp .edmx (qua notepad, v.v.). Chỉ cần sao lưu nó trước khi bạn thay đổi nó. Nó không lý tưởng, nhưng nó hoạt động và cập nhật từ db không ghi đè lên các thay đổi của bạn.

<EntityType Name="SomeEntityName" a:TypeAccess="Internal" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration"> 
    <Key> 
     <PropertyRef Name="Id" /> 
    </Key> 
    <Property Name="Id" Type="Int32" Nullable="false" annotation:StoreGeneratedPattern="Identity" /> 
    <Property Name="Contact" Type="String" Nullable="false" MaxLength="Max" FixedLength="false" Unicode="false" /> 
    <Property Name="DesignContact" Type="String" Nullable="false" MaxLength="50" FixedLength="false" Unicode="false" /> 
</EntityType> 
+0

Tôi ** không có ** tệp '.edmx' ...... điều này được tạo từ cơ sở dữ liệu vào ** mã đầu tiên ** (hoặc chỉ mã) Các lớp C# - không còn tệp '.edmx' ..... –

+0

@marc_s Đọc kém về phía tôi. Tôi đã đi mã đầu tiên và viết ánh xạ thực thể không phải là quá xấu, trong đó, nếu tôi đọc chính xác, sẽ làm giảm bớt vấn đề của bạn. Nếu không, tôi đã tạo edmx và chỉnh sửa nó nếu cần. –

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