我有一个像这样定义的类:
public class Location
{
public Location()
{
Meetings = new List<Meeting>();
}
public virtual int ID { get; private set; }
public virtual string Name { get; set; }
public virtual ICollection<Meeting> Meetings { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而这个数据库表只是带有ID和Name属性的"位置".
其他一些表"会议"有一个外键回到此表.它是超出了我想在这个例子中与之合作的范围,但我认为这是造成PetaPoco失败...
我正在尝试使用PetaPoco将新位置插入数据库,如下所示:
public int AddLocation(string name)
{
var newLocation = new Location{Name = name};
var db = new PetaPoco.Database(_connectionString);
db.Insert("locations", "ID", newLocation);
return newLocation.ID;
}
Run Code Online (Sandbox Code Playgroud)
它会抛出这样的错误:
{"对象类型System.Collections.Generic.List`1 [[NHRepoTemplate.sampleUsage.sampleModel.Meeting,NHRepoTemplate,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]不存在映射到已知的托管提供者本机类型."}
在我看来,子集合的存在导致PetaPoco无法进行插入,但是......必须有一种方法告诉它"忽略"那个,对吧?
PetaPoco已经以实验形式引入了多POCO查询(目前).正如他们的博客文章所建议的那样,并且它提供的代码看起来很好,并且当我们每行加载多个POCO时,只要它们不重复记录,所有这些都是一对一的关系.
当至少一方有很多关系时会发生什么?实际上,示例代码是多对一关系数据.
示例代码显然是多对一关系.我没有测试任何PetaPoco代码,但博客文章中提供的代码是做什么的?是否每个Article都有自己的User对象实例,即使某些用户可能是同一个用户,或者他们共享同一个用户对象实例?
那么其他许多关系类型呢?他们如何工作?
我有一个项目,其中有我的API类,并且在该项目中,我生成了Database.cs。在我的MVC项目中,我已经修改了API。Uppon运行该应用程序时,我收到以下错误消息,由于我无法理解为什么收到此错误消息,因此任何人都可以提供帮助。
从http://www.garethelms.org/2011/05/help-getting-started-with-petapoco/#comment-69,我发现自安装petaPOCo以来,所有的GetSetMethod()都是GetSetMethod(true)。 。
值不能为空。参数名称:meth描述:当前Web请求执行期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.ArgumentNullException:值不能为null。参数名称:meth
源错误:
第1990行:}第1991行:第1992行:il.Emit(OpCodes.Callvirt,pc.PropertyInfo.GetSetMethod(true)); // poco Line 1993:Handled = true;1994行:}
源文件:C:\ Dev \ MyProjectTest \ Code \ API \ Models \ PetaPoco.cs行:1992
堆栈跟踪:
[ArgumentNullException: Value cannot be null. Parameter name: meth]
System.Reflection.Emit.DynamicILGenerator.Emit(OpCode opcode, MethodInfo meth) +9492330 PetaPoco.PocoData.GetFactory(String sql, String connString, Boolean ForceDateTimesToUtc, Int32 firstColumn, Int32 countColumns, IDataReader r) in C:\Dev\MyProjectTest\Code\API\Models\PetaPoco.cs:1992
PetaPoco.d__71.MoveNext() in C:\Dev\MyProjectTest\Code\API\Models\PetaPoco.cs:7651..ctor(IEnumerable
System.Collections.Generic.List1 collection) +327 System.Linq.Enumerable.ToList(IEnumerable1 source) +58
PetaPoco.Database.Fetch(String sql, Object[] args) in C:\Dev\MyProjectTest\Code\API\Models\PetaPoco.cs:601
PecaTest.NewProject.API.Customer.LoadSortedByName() in C:\Dev\MyProjectTest\Code\API\Customer.cs:68
PecaTest.NewProject.MvcUI.Models.CustomerListModel..ctor() in C:\Dev\MyProjectTest\Code\MvcUI\Models\CustomerListModel.cs:14 …
我正在使用CTE与PetaPOCO并获得一个奇怪的错误
SQL Exception: Invalid Object Name PayTransactionForRollingVacationAverage,该错误引用了数据应该映射到的模型.
代码如下.
public IEnumerable<PayTransactionForRollingVacationAverage> GetPayTransactionForRollingVacationAverage(DateTime payEndingDate)
{
PointsNorth.PetaPoco.Sql sql = new PointsNorth.PetaPoco.Sql();
sql.Append(@"
;with HolidayWeeks as
(
Select Distinct EmployeeId, PayEndDate, 'Y' as HolidayWeek
from PayTransactions
where PayEndDate = @payEndingDate
and LaborCode in ('251', '249')
)", new { payEndingDate });
sql.Append(@"
Select
PT.EmployeeId,
PT.PayEndDate,
J.JobClass,
PayCodes.AverageRateCode,
PT.RegularHours,
PT.RegularRate,
PT.RegularAmount
from PayTransactions PT
Left Outer Join PayCodes on PayCodes.PayCodeCode = PT.LaborCode
Left Outer Join HolidayWeeks as H on H.PayEndDate = PT.PayEndDate and H.EmployeeId = …Run Code Online (Sandbox Code Playgroud) PetaPoco.Database对象实现了IDisposable,但我很少看到包含using语句的代码示例(包括在PetaPoco 自己的网站上),如下所示:
using (var db = new Database("MyConnectionString"))
{
// Do database stuff
}
Run Code Online (Sandbox Code Playgroud)
我经常看到:
var db = new Database("MyConnectionString");
// Do database stuff
// I never see .Dispose() called.
Run Code Online (Sandbox Code Playgroud)
PetaPoco.Database对象应该如何实际交付?
下面的代码似乎使用这个:
var unitOfWorkProvider = new PetaPocoUnitOfWorkProvider();
var repository = new FakeRepository();
var fake = new Fake
{
// etc.
};
using (var uow = unitOfWorkProvider.GetUnitOfWork("BlaConnectionString"))
{
repository.Insert(uow, fake);
uow.Commit();
}
Run Code Online (Sandbox Code Playgroud)
最终可能会进入服务层.我将不胜感激任何改进此代码的反馈.
public interface IUnitOfWork : IDisposable
{
void Commit();
Database Database { get; }
}
public interface IUnitOfWorkProvider
{
IUnitOfWork GetUnitOfWork(string connectionString);
}
public class PetaPocoUnitOfWorkProvider : IUnitOfWorkProvider
{
public IUnitOfWork GetUnitOfWork(string connectionString)
{
return new PetaPocoUnitOfWork(connectionString);
}
}
public interface IRepository<T>
{
void Insert(IUnitOfWork unitOfWork, T entity);
void Update(IUnitOfWork …Run Code Online (Sandbox Code Playgroud) 我注意到 NPoco(或 PetaPoco)的工作方式存在巨大差异,具体取决于您使用 LINQ 时调用的函数。
例如,比较 Fetch() 和 Query(),两者似乎都做同样的事情:
A:Fetch<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);
乙:Query<EntryImage>().Where(t => t.EntryType == type && t.EntryID == entryID);
A返回表中的每一行(10,000+),然后过滤客户端。
B仅返回我期望的一行。
我发现这种行为非常危险——很容易在晚上不注意的情况下编写出性能非常糟糕的代码。这是预期的行为吗?如果这是正常行为,有什么方法可以获取以这种方式工作的方法列表,以便我可以尽可能避免使用它们?
我正在使用Npgsql 3.0.3.0和PetaPoco最新版本。
当我运行此命令时:
var dateCreated = DateTime.Now; // just an example
var sql = new Sql("WHERE date_created = @0", dateCreated.ToString("yyyy-MM-dd HH:00:00"));
var category = db.SingleOrDefault<Category>(sql);
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Npgsql.NpgsqlException 42883:操作符不存在:没有时区的时间戳=文本
我知道错误消息是说我正在尝试将时间戳记(日期)与文本进行比较,但是对我来说,将它们进行比较是完全有效的,因为我希望构建以下SQL语句:
SELECT * FROM category WHERE date_created = '2017-02-03 15:00:00'
Run Code Online (Sandbox Code Playgroud)
出于性能原因,我真的不想将数据库列转换为文本。
我使用C#,SQL Server和PetaPoco,它们ID默认情况下会自动递增。我只想知道是否可以将此自动递增的id设置为另一列。
我还有2列需要设置ID的确切值。是否可以在SQL CREATE TABLE语句中执行此操作,或者在执行此操作之前或之后执行某些挂钩操作ExecuteNonQuery?如果可能的话,我不想创建视图或触发器。
我在尝试插入时遇到了这个错误:
无法将值NULL插入列'Id'
事实证明,PetaPoco默认假设Id列是自动递增的,所以即使你提供了一个值,它也会尝试插入null.我在这里找到了一个问题的错误票:https://dnntracker.atlassian.net/browse/DNN-23217.
我正在使用PetaPoco的T4模板来生成我的数据库类.我创建了一个部分类,应用了数据注释来禁用自动增量:
[PrimaryKey("Id", autoIncrement = false)]
public partial class Blah : DatabaseDB.Record<Database.Blah>
{
}
Run Code Online (Sandbox Code Playgroud)
但它似乎没有效果.当我指定一个整数时,PetaPoco仍在尝试为Id列插入null.
petapoco ×10
c# ×5
.net ×1
dispose ×1
idisposable ×1
linq ×1
micro-orm ×1
npgsql ×1
npoco ×1
orm ×1
postgresql ×1
repository ×1
sql-server ×1
unit-of-work ×1