2016-03-24 37 views
0

Veritabanındaki görünüm tarafından temsil edilen bir EF öğesine, saklı yordamın eşlenmesiyle ilgili bir sorunum var.Kayıtlı yordamları görünümlere eşleme

Aramaya denerseniz, örneğin, bir .Add yöntemi - EF tüm parametreleri istediği,

Çok fazla parametre hatası ... G/anlayabiliyorum

olsun eşlenen Eklenti saklı yordamındaki anahtarlar (+ bilgisayar) dışında. Ancak "varlık = görünüm" durumunda, saklı yordam parametrelerini yalnızca db tablosunda bulunan bazı EF varlık alanları kümesini yüklemek istiyorum (ekleme durumunda bir alan, güncelleme durumunda başka bir set , silme durumunda üçüncü set).

Bu "nasıl yapılır?" Nasıl yapılır? DB

Görünüm ..

CREATE VIEW vDepartment 
AS 
    SELECT 
     d.*, 
     dp.Code as ParentCode, dp.SName as ParentSName, 
     dp.Name as ParentName 
    FROM 
     Department d 
    LEFT OUTER JOIN 
     Department dp ON d.ParentID = dp.ID 

EF: .edmx yılında ..

Örnek bu (grafik arayüz üzerinden eşleme) mükemmel çalışıyor ama kod birinci eliyle bu davranışı gerçekleştirmek için gereken varlık

public partial class vDepartment 
{ 
    public long ID { get; set; } 
    public Nullable<long> ParentID { get; set; } 
    public string Code { get; set; } 
    public string SName { get; set; } 
    public string Name { get; set; } 
    public Nullable<System.DateTime> CloseDate { get; set; } 
    public string ParentCode { get; set; } 
    public string ParentSName { get; set; } 
    public string ParentName { get; set; } 
} 

Haritalama ..

modelBuilder.Entity<vDepartment>().MapToStoredProcedures(s => 
      { 
       s.Update(u => u.HasName("udp_Department_upd")); 
       s.Delete(d => d.HasName("udp_Department_del")); 
       s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID")); 
      }); 
012 veritabanında

takın saklı yordam:

CREATE PROC [dbo].[udp_Department_ins] 
    @ParentID BIGINT, 
    @Code  NVARCHAR(20), 
    @SName  NVARCHAR(50), 
    @Name  NVARCHAR(100), 
    @CloseDate DATE 
AS 
BEGIN 
    DECLARE @NewID bigint; 

    INSERT INTO Department... 
     SELECT @NewID AS NewID; 
END; 
+0

Depolanan proc eşlemlerinizi tanımladığınızda, her kayıtlı proc için parametreleri tanımlamak için daha fazla seçenek var mı? – Brad

+0

Bunu açıklamaya çalıştım ama aynı hatayı aldım. s.Insert (i => i.HasName ("udp_Department_ins") .Parametre (e => e.ParentID, "Ebeveyn Kimliği") .Parametre (e => e.Code, "Kod") .Parametre (e => e.Sayı, "SName") .Parameter (e => e.Adı, "Ad") .Parametre (e => e.CloseDate, "CloseDate") .Result (r => r.ID "NewID") ); – Valerdos

+0

Kod ilk yaklaşımı bir veritabanına ilk sisteme zorlamaya çalışıyorsunuz. Benim deneyimlerimde varlıkları görüş haritalama her zaman tek yönlü olmuştur (POCO'lar için veritabanı) ve saklı provaları kullanarak ekler, güncellemeler veya silmeler içermez. Yalnızca eklediğiniz depolanmış proc'unuzun parametrelerini eşlemek için POCO içeren özellikler oluşturmanızı öneririm.Ancak, bu kod ilk yol değildir ve veri katmanınıza gereksiz bir karmaşıklık katar. – Brad

cevap

0

Yapabileceğiniz: ParentSName ve parentname önlemek için

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentSName { get; set; } 
[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ParentName { get; set; } 

Saklı prosedüre parametre olarak sunulmaya. Bunun, bu sütunların veritabanınızda gerçek hesaplanmış sütunlar olması gerektiği anlamına gelmediğini unutmayın. Etkin olarak, EF'e güncellenemeyen/okuyamayacaklarını işaretler.

Eşlemeyi edmx tasarımcısında olduğu gibi belirli bir saklı yordam için bir parametreyi yoksayacak şekilde eşleme yapmanın doğrudan bir yolunu bulamadım.

Ve hesaplanan sütunları saklı yordamınızın çıktısı olarak eklemeyi unutmayın. Bu değerler güncellemede veritabanında değişirse, bu gerekli olabilir veya olmayabilir.

s.Insert(i => i.HasName("udp_Department_ins").Result(r => r.ID, "NewID").Result(r => r.ParentName , "ParentName") 
İlgili konular