洋葱架构 - 实体框架代码首先模型数据注释

时间:2013-06-05 16:25:24

标签: entity-framework-5 data-annotations poco onion-architecture

我正在开发一个遵循洋葱架构的ASP.NET MVC项目。我在我的核心项目中添加了模型,这些模型将被称为基础结构项目中实体框架模型的POCO类。

我的问题是如何添加依赖于实体框架的数据注释?

我可以将核心模型作为接口并在基础结构项目中继承它并进行实际实施吗?

2 个答案:

答案 0 :(得分:13)

如果从Data Annotations切换到Fluent API,则无需将Core Models创建为接口。

这是一个例子。

Entity1对象是核心层域对象:

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

在基础架构层中,创建一个Entity1Mapping类,您可以使用Data Annotation执行您已完成的操作,但这次使用的是Fluent 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();
}

答案 1 :(得分:2)

在我看来,使用FluentAPI是一个很好的解决方案。

值得注意的是,System.Component.DataAnnotations不依赖于EntityFramework - 因此您可以在核心项目中使用DataAnnotations,并且仍然对您的特定持久性机制不可知。