4

我正在開發一個遵循洋蔥架構的ASP.NET MVC項目。我在我的核心項目中添加了模型,這些模型將被稱爲基礎設施項目中實體框架模型的POCO類。洋蔥架構 - 實體框架代碼第一個模型DataAnnotations

我的問題是如何添加數據註釋依賴於實體框架?

我可以將核心模型作爲接口並在基礎架構項目中繼承它並執行真正的實現嗎?

回答

12

如果您從數據批註切換到Fluent API,則不需要將核心模型創建爲接口。

下面是一個例子。

Entity1對象是核心層域對象:

namespace MyApp.Core.Model 
{ 
    public class Entity1 
    { 
    public short Id { get; set; } 
    public string ExternalCode { get; set; } 
    public byte Status { get; set; } 
    } 
} 

在基礎設施層,創建一個類Entity1Mapping在那裏你會做什麼你就必須使用數據註解來實現,但這個時候,與在流暢API來代替:

using System.Data.Entity.ModelConfiguration; 

namespace MyApp.Infrasrtucture.Data.Configuration 
{ 
    internal class Entity1Mapping : EntityTypeConfiguration<Core.Model.Entity1> 
    { 
    internal Entity1Mapping() 
    { 
     HasKey(g => g.Id); 
     Property(g => g.Id).IsRequired(); 

     Property(g => g.ExternalCode) 
      .IsRequired() 
      .HasMaxLength(100) 
      .IsVariableLength() 
      .IsUnicode(false); 

     Property(g => g.Status).HasColumnName("EntityStatus").IsRequired(); 
    } 
    } 
} 

你要做的最後一件事,是添加映射在上下文的modelBuilder

using System.Data.Entity; 

namespace MyApp.Infrastructure.Data 
{ 
    public class MyContext : DbContext, IDbContext 
    { 
    public MyContext() : base("ConnectionStringMyContext") 
    { } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer<MyContext>(null); 
     modelBuilder.Configurations.Add(new Configuration.Entity1Mapping()); 
    } 
    } 
} 

這是IDBContext以防萬一:

public interface IDbContext 
{ 
    DbSet<T> Set<T>() where T : class; 
    DbEntityEntry<T> Entry<T>(T entity) where T : class; 
    int SaveChanges(); 
    void Dispose(); 
} 
+0

看起來像一個很好的解決方案。我沒有把這個標記爲答案,只是爲了看看是否有其他有趣的方法即將到來。 – Saanch

+0

@max我喜歡這個解決方案,但是我有一個關於Remote Attribute的問題,在這種情況下如何處理它?謝謝。 –

+2

那麼你不應該使用你的領域模型作爲視圖模型。核心層域實體旨在管理您的業務,而不是您將顯示給用戶的內容。所以你肯定會有其他的表示實體(viewmodels),你可以像你習慣的那樣放置你的Remote屬性(這將取決於模型構建器將你的域對象映射到視圖模型) – MaxSC

2

使用FluentAPI是一個很好的在我看來,一個解決方案。

值得注意的是,雖然System.Component.DataAnnotations不依賴於EntityFramework - 因此您可以在覈心項目中使用DataAnnotations,並且仍然不能確定您的特定持久性機制。