我正在Django中编写一个项目,我发现80%的代码都在文件中models.py.这段代码令人困惑,经过一段时间后,我不再明白究竟发生了什么.
这是困扰我的:
User,但从技术上讲,它应该统一创建它们.这是一个简单的例子.起初,User模型是这样的:
class User(db.Models):
def get_present_name(self):
return self.name or 'Anonymous'
def activate(self):
self.status = 'activated'
self.save()
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,它变成了这样:
class User(db.Models):
def get_present_name(self):
# property became non-deterministic in terms of database
# data is taken from another service by api
return remote_api.request_user_name(self.uid) or 'Anonymous'
def activate(self):
# method now has a side effect (send message to user)
self.status = 'activated'
self.save()
send_mail('Your account is activated!', '…', [self.email])
Run Code Online (Sandbox Code Playgroud)
我想要的是在我的代码中分离实体:
实现可以在Django中应用的这种方法有哪些好的做法?
python django model-view-controller business-logic-layer data-access-layer
数据访问对象(DAO)和存储库模式之间有什么区别?我正在开发一个使用Enterprise Java Beans(EJB3),Hibernate ORM作为基础架构,域驱动设计(DDD)和测试驱动开发(TDD)作为设计技术的应用程序.
domain-driven-design hibernate data-access-layer repository-pattern ejb-3.0
它们是一样的吗?刚看完Rob Connery的店面教程,他们似乎是类似的技术.我的意思是,当我实现一个DAL对象时,我有GetStuff,Add/Delete等方法,我总是首先编写接口,这样我以后就可以切换db了.
我混淆了什么吗?
我已经接近一个新项目的开始了(喘气!)我第一次尝试将单元测试包含在我的项目中.
我自己设计一些单元测试时遇到了麻烦.我有一些方法很容易测试(传入两个值并检查预期的输出).我有代码的其他部分正在做更复杂的事情,比如对数据库运行查询,我不知道如何测试它们.
public DataTable ExecuteQuery(SqlConnection ActiveConnection, string Query, SqlParameterCollection Parameters)
{
DataTable resultSet = new DataTable();
SqlCommand queryCommand = new SqlCommand();
try
{
queryCommand.Connection = ActiveConnection;
queryCommand.CommandText = Query;
if (Parameters != null)
{
foreach (SqlParameter param in Parameters)
{
queryCommand.Parameters.Add(param);
}
}
SqlDataAdapter queryDA = new SqlDataAdapter(queryCommand);
queryDA.Fill(resultSet);
}
catch (Exception ex)
{
//TODO: Improve error handling
Console.WriteLine(ex.Message);
}
return resultSet;
}
Run Code Online (Sandbox Code Playgroud)
此方法基本上包含从数据库中提取一些数据所需的所有必要部分,并返回DataTable对象中的数据.
第一个问题可能是最复杂的问题:在这样的情况下我应该测试什么?
一旦解决了问题,是否要模拟数据库组件或尝试对实际数据库进行测试.
database testing integration-testing unit-testing data-access-layer
我有一个使用NHibernate作为其ORM的应用程序,有时它会遇到性能问题,因为它是如何访问数据的.可以做些什么来改善NHibernate的性能?(每个答案限于一个建议)
我知道这可能是意见,但我正在寻找最佳实践.
据我所知,IQueryable<T>实现IEnumerable<T>,所以在我的DAL中,我目前有方法签名,如下所示:
IEnumerable<Product> GetProducts();
IEnumerable<Product> GetProductsByCategory(int cateogoryId);
Product GetProduct(int productId);
Run Code Online (Sandbox Code Playgroud)
我应该IQueryable<T>在这里使用吗?
这两种方法的优点和缺点是什么?
请注意,我打算使用Repository模式,所以我将有一个这样的类:
public class ProductRepository {
DBDataContext db = new DBDataContext(<!-- connection string -->);
public IEnumerable<Product> GetProductsNew(int daysOld) {
return db.GetProducts()
.Where(p => p.AddedDateTime > DateTime.Now.AddDays(-daysOld ));
}
}
Run Code Online (Sandbox Code Playgroud)
我应该改变我IEnumerable<T>的IQueryable<T>吗?一个或另一个有哪些优点/缺点?
这些术语经常互换,并且显然有相当大的重叠,但同样似乎暗示人们看到一个强烈暗示的东西,说系统是一个ORM而不是它是DAL所暗示的.那是什么?如果有的话,区分这些类型系统的关键点是什么?
例如,假设我有一些代码实现了Database,Table,Column和Row类,通过自动分析现有数据库来填充它们,允许简化交互等等.它理解,实施并利用数据库实体(如外键)之间的结构关系.可以对所有实体模型进行子类化,以将特定于表的功能加载到它们上.
这个DAL到什么程度?ORM在多大程度上?为什么?
我首先使用.NET 4.0,MVC3和EF5代码.
我的解决方案分为三个项目,依赖项如下所示:
Project.Web - > Project.BLL - > Project.DAL
Project.DAL层包含我的实体框架数据上下文类和我的所有实体,但我的启动项目是Project.Web,因此它包含我的Web.config,连接字符串和实际的SQL压缩数据库.
我正在尝试启用迁移,因此我可以在不擦除现有数据的情况下向EF模型添加新表.但是,当我运行"启用 - 迁移"时,我得到了
No context type was found in the assembly 'Project.Web'.
Run Code Online (Sandbox Code Playgroud)
如果我将启动项目设置为Project.DAL,则错误更改为
Could not load assembly 'Project.Web'. (If you are using Code First Migrations inside Visual Studio this can happen if the startUp project for your solution does not reference the project that contains your migrations. You can either change the startUp project for your solution or use the -StartUpProjectName parameter.)
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会出现这个错误或者我可以做些什么来修复它?
asp.net entity-framework connection-string data-access-layer entity-framework-5
我将DAL从使用LINQ切换到Entity Framework.因为我的应用程序根据当前用户连接到不同的数据库,所以我需要在运行时动态创建DataContext并传入适当的连接字符串.但是,当我尝试使用旧连接字符串以编程方式创建实体框架连接时,连接失败.它抱怨它没有识别连接字符串中的密钥,确切地说是"服务器".
我发现我需要这样做才能使Entity Framework连接正常工作:
EntityConnectionStringBuilder entityBuilder = new EntityConnectionStringBuilder();
entityBuilder.Provider = "System.Data.SqlClient";
entityBuilder.ProviderConnectionString = clientConnectionString;
entityBuilder.Metadata = "res://*/xxxxxxxxxx.csdl...";
Entities entities = new Entities(entityBuilder.ToString());
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
什么是元数据属性?
对于多个不同的连接,它总是一样的问题吗?
它应该是什么?
有没有办法解决?
提前致谢!
更新1:感谢更新Randolpho,但是......
我遇到此问题的全部原因是我无法将连接字符串存储在配置文件中.连接字符串在运行时由用户连接动态确定.
这是我的确切场景:
如果用户A正在连接,则应用程序从数据库A中提取数据.如果用户B正在连接,则应用程序从数据库B中提取数据.
连接字符串存储在主数据库中,并且该数字可能是无限的.每次添加用户时,我都不想进入web.config,更不用说它最终会变得巨大!
database connection entity-framework connection-string data-access-layer
database ×2
orm ×2
.net ×1
asp.net ×1
asp.net-mvc ×1
connection ×1
dao ×1
datacontext ×1
django ×1
ejb-3.0 ×1
hibernate ×1
iqueryable ×1
linq-to-sql ×1
nhibernate ×1
performance ×1
python ×1
terminology ×1
testing ×1
unit-testing ×1