c# - MVC 4 后期绑定(bind) DataContext 实体 LINQ 引用

标签 c# asp.net-mvc entity-framework linq-to-entities datacontext

长期倾听者,第一次来访者。

我可能对此采取了错误的方法,所以任何帮助都会很棒。

我正在使用 C#、MVC 4、Code First、Entity Framework 4.3 和 Razor。

我正在尝试将 EF 数据类和一些方法拆分到一个单独的类项目中,以便它们通常可以被多个其他项目引用。我创建了这个简化示例来尽可能多地突出问题。

所以在一个类项目中我有:

public MyGeneric(string name)
{
    ID = Guid.NewGuid();
    Name = name;
}

public Guid ID { get; set; }
public string Name { get; set; }


public void AddThis(MyGeneric obj)
{
    using (var db = Activator.CreateInstance<myDbContext>())
    {
        var myOthers = from mo in db.MyOther
                       where mo.OtherID == obj.ID
                       select mo;

        myOthers.ForEach(mo => db.MyOther.Add(mo));
        db.SaveChanges();
    }
}

然后我可以在主项目中引用它,例如:

public class SampleInherit : MyGeneric
{
    public SampleInherit(string newName, string secName)
        : base(newName)
    {
        SecName = secName;
    }

    public string SecName { get; set; }


    public void DoSomething(SampleInherit obj)
    {
        base.AddThis(obj);
        // do other stuff
    }
}

我想做的是将几个类及其方法通用化(这是一个词吗?)到一个单独的副项目中。该副项目将提供基类,这些基类将(按所需顺序):

  • 使用 EF DbContext 创建/访问数据库,
  • 允许添加更多属性,
  • 提供影响基础数据的方法/程序,
  • 更适合主要项目的重命名。

现在,如果我只是将基类继承到主项目中的类中,除了基类引用 myDbContext 和 LINQ 语句中的实体对象引用外,它都可以正常工作。

你能延迟绑定(bind) DataContext 还是我把自己画到一个角落里了?

为您能提供的所有帮助干杯。

最佳答案

我认为您要做的是实现 IRepository 模式。基本上你想要做的是创建一个包含你的实体和你的 IRepository 的类项目。从那里,您可以通过创建 Repository 类来创建 IRepository 的具体实现。您使用业务逻辑层通过 IRepository 访问存储库。并在那里访问您的数据。

public interface IRepository<T>
{
    IQueryable<T> Fetch();

    bool Insert(T entity);

    bool Update(T entity);
}

然后创建你的仓库

public class MyRepository<TContext> : IRepository<EntityType> where TContext: DbContext, new()
{
    private TContext context;

    public MyRepository(TContext context)
    {
        this.context = context;
    }

    public IQueryable<T> Fetch()
    {
       return context.EntityTypes;
    }

    // Insert and update logic
}

最后创建你的业务逻辑

public class BusinessLogic
{
    private IRepository<EntityType> repository;

    public BusinessLogic(IRepository<EntityType> repository)
    {
        this.repository = repository;
    }

    public void Add(EntityType obj)
    {
      bool isNew = // check if new
      if(isNew)
      {
        this.repository.Insert (obj)    
      }
      else
      {
        this.repository.Update(obj);
      }
    }
}

然后调用你的业务逻辑

IRepository<EntityType> repository = new MyRepository<MyDbContext>(new MyDbContext());
BusinessLogic service = new BusinessLogic(repository);

service.Add(new EntityType());

我认为您不需要数据上下文的后期绑定(bind),出于性能考虑,最好使用泛型(如上例所示)。此外,使用此方法,您可以实例化一个数据上下文并将其传递给您的业务服务,以便 Entity Framework 可以跟踪您的实体,而不是为每次调用 AddThis 实例化一个新的数据上下文。加上这个模式,你可以做各种很酷的事情,比如使用像 ninject 这样的 IOC 容器为你创建这些业务服务,并使用 Mocks 为你的代码创建单元测试而不必访问数据库(通过模拟你的存储库).

关于c# - MVC 4 后期绑定(bind) DataContext 实体 LINQ 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11407729/

相关文章:

c# - 如何将相同的查询应用于不同的实体?

c# - Entity Framework 查询中令人难以置信的重复

asp.net-mvc - 将 Ninject.MVC3 添加到现有的 MVC(4) 项目中

asp.net-mvc - Controller 未从不同的程序集加载?

asp.net-mvc - 同时使用 NWebSec.Mvc 和 NWebSec.OWIN 时,是否需要在 2 个地方配置安全性?

c# - 连接字符串中的撇号(单引号)

c# webform 代码不会更新我的 Access 数据库

c# - DrawImage 调整后的图像太小

c# - 在 ML.NET 中指定训练时间的位置

c# - 是否有一种标准方法可以将 .NET 字符串编码为 JavaScript 字符串以便在 MS Ajax 中使用?