我正在尝试使用以下代码将实体保存到我的数据库:
public void Add(object entity)
{
DbContext.Entry(entity).State = System.Data.EntityState.Added;
DbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我测试过,如果出现问题(例如,实体的字段为空,在数据库中不能为空),则会出错.我填写了所有necesarry字段并调用了此代码.它没有给出错误.但是,该实体也未添加到数据库中.我怎样才能找到DbContext.SaveChanges(); 没有错误信息会出错?
下面是调用Add()函数的代码.
public void StoreElectronicSignatureType(ElectronicSignatureTypeModel model)
{
var RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
var parameters = RSA.ExportParameters(false);
model.modulus = Convert.ToBase64String(parameters.Modulus);
model.exponent = Convert.ToBase64String(parameters.Exponent);
model.privatekey = RSA.ToXmlString(true);
ElectronicSignatureType electronicSignatureType = new ElectronicSignatureType();
Entity entity = GetEntity(model.entity);
electronicSignatureType.Entity = entity;
electronicSignatureType.HashAlgorithm = model.hashAlgorithm;
electronicSignatureType.Exponent = model.exponent;
electronicSignatureType.Modulus = model.modulus;
electronicSignatureType.Version = model.version;
//electronicSignatureType.EntityId = entity.EntityId;
electronicSignatureType.PrivateKey = StrToByteArray(model.privatekey);
Add(electronicSignatureType);
}
Run Code Online (Sandbox Code Playgroud) 我使用与实体框架数据库的第一种方法,当我习惯使用的ObjectContext的数据库表被映射的默认模板工作,所以我用来创建#partial类&[MetadataType(typeof运算)以应用数据注解,,但是当我开始使用的DbContext代码生成模板来映射数据库表,我发现,它会在我的示范区创建.TT文件夹都被我发现,我可以直接申请数据注解到的.cs类本身,而不需要创建在objectcontext情况下的部分类.目前数据注释工作正常,但我的方法会导致我不知道的问题,我应该创建部分类,因为我曾经使用Objectcontext吗?BR
我已经搜索了谷歌并且花了很多时间试图弄清楚我的WCF和客户端Windows窗体应用程序发生了什么.
我不断收到以下错误
"Unable to set field/property Ingredients on entity type Datalayer.UnitOfMeasure. See InnerException for details."
...
inner exception is
"An item cannot be added to a fixed size Array of type 'Datalayer.Ingredient[]'."
Stack Trace -
at System.Data.Objects.Internal.PocoPropertyAccessorStrategy.<AddToCollection>b__0[T](Object collectionArg, Object item)
at System.Data.Objects.Internal.PocoPropertyAccessorStrategy.CollectionAdd(RelatedEnd relatedEnd, Object value)
Run Code Online (Sandbox Code Playgroud)
我配置我的解决方案的方式我有一个引用我的DataLayer类库的WCF Web服务,我有一个Windows应用程序(测试应用程序),它引用了WCF服务以及DataLayer项目.
如果我没有在我的测试应用程序中引用DataLayer,则不会发生此问题,但是我会丢失ICollection<Ingredient>到简单Ingredient[]数组.现在你可以看到,每次初始化数组都会成为编码的痛苦.
任何想法的人?提前致谢.
现在我已经通过以下方式从现有数据库生成了19个代码优先类:
我想要的所有课程都已生成,我对他们非常满意......
现在我的问题
我想我的整体问题是,为什么它们位于.tt文件夹中?我现在该如何更新我的数据库?通过手动编辑数据库然后更新Model,然后再次生成dbContext?或者是否有从.tt文件夹中获取.cs文件的技巧?
如何你修改你的数据库生成您的DbContext后?
在我的最新项目中,我认为在整个应用程序中只有一个上下文可能更简单.我注意到当我加载一个需要多个查询的页面时,它可能会返回空结果.
例如,我有一份约会清单,然后是销售代表清单.他们表现得很好.然后我点击F5,有时一切都会保持良好,但有时约会和/或代表列表将是空的.
这是单个上下文应用程序的已知问题吗?那个设计不好吗?
考虑以下课程:
class MyContext : DbContext
{
public DbSet<Order> Orders { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并实例化一个新对象:
var mycontext = new MyContext();
Run Code Online (Sandbox Code Playgroud)
为什么mycontext.Orders不为null?什么时候初始化?谁初始化了它?我真的很困惑,因为基类(DbConetxt)无法访问派生类属性,因此不可能在基础对象中初始化自动属性.
我的Service类(在ASP.NET MVC应用程序中)中的当前检索模式如下所示:
public Client Get(int id)
{
using (var repo = _repoFactory.Get<Client>())
{
return repo.Get(id);
}
}
Run Code Online (Sandbox Code Playgroud)
当_repoFactory.Get<T>()返回贮藏库,配置时,还部署了实体框架DbContext;
但是,当Get(int id)方法的使用者需要在Client对象上使用导航属性时,会抛出异常,因为已经处理了上下文.
我可以预见几种方法来协商这个问题:
什么是"正确"(或最不正确)的方式以及如何实现?
我想知道是否有人在FakeItEasy 这篇文章中有类似的例子(原帖是在这里.我一直试图找到正确的设置,但无法正确.我在网上找不到任何例子.我开始教我自己单元测试,我决定使用FakeItEasy.到目前为止,我所有的项目都使用实体框架而不使用Repository/UOW模式,因为我认为DbSet和DbContext足以满足我的小规模应用程序.我明白有利可图EF和单元测试,但我仍然想知道这一点.我很确定我的尝试(见下文)我已经离开了,因为我得到的错误是
System.NotImplementedException:成员'IQueryable.Provider'尚未在类型'DbSet
1Proxy' which inherits from 'DbSet1'上实现.'DbSet`1'的测试双精度必须提供所使用的方法和属性的实现.
任何方向都会非常有帮助.谢谢.
var data = new List<Request>
{
request1,
request2,
request3
}.AsQueryable();
var fakeDbSet = A.Fake<DbSet<Request>>();
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Provider).Returns(data.Provider);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).Expression).Returns(data.Expression);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).ElementType).Returns(data.ElementType);
A.CallTo(() => ((IQueryable<Request>)fakeDbSet).GetEnumerator()).Returns(data.GetEnumerator());
var fakeContext = A.Fake<RequestPortalContext>();
A.CallTo(() => fakeContext.Requests).Returns(fakeDbSet);
var service = new RequestReadService(fakeContext);
var requests = service.GetAllRequests();
Assert.AreEqual(3, requests.Count);
Assert.AreEqual("Test1", requests[0].Name);
Assert.AreEqual("Test2", requests[1].Name);
Assert.AreEqual("Test3", requests[2].Name);
Run Code Online (Sandbox Code Playgroud) 将最新的EF(6.1.1)和EF用于SQL Server Compact(6.1.1),将其引入Compact 4.0。目标是净4.5.1
希望对我的EF进行编码,然后再与StructureMap一起使用。创建了一个DbConfiguration类:
public class MyConfiguration : DbConfiguration
{
SetDatabaseInitializer<MyContext>(new MyInitializer());
SetProviderServices(SqlCeProviderServices.ProviderInvariantName,
SqlCeProviderServices.Instance);
}
Run Code Online (Sandbox Code Playgroud)
和上下文:
public class MyContext : DbContext
{
public MyContext(String connection) : base(connection) {}
....
}
Run Code Online (Sandbox Code Playgroud)
使用XUnit我运行:
using (var ctx = new MyContext(String.Format("Data Source={0}", Path.Combine(databasePath, databaseName)))) {
ctx.Database.Initialize(true)
}
Run Code Online (Sandbox Code Playgroud)
测试用例成功创建了Compact数据库(并通过初始化程序植入了种子)。但是在幕后发生了很多我不了解的隐性事情。
例如,我不需要在MyContext类上使用以下注释:
[DbConfigurationType(typeof(MyConfiguration))]
Run Code Online (Sandbox Code Playgroud)
EF必须足够聪明才能看到我有一个MyConfiguration类来扩展DbConnection并使用它。要么?我还可以一起删除MyConfiguration,并且测试用例仍将生成一个数据库(显然没有种子)。怎么样?
我希望能够使用代码将DbConfiguration分配给特定的DbContext,而无需通过静态操作:
static MyContext()
{
DbConfiguration.set(new MyConfiguration());
}
Run Code Online (Sandbox Code Playgroud)
原因是也要与StructureMap使用不同的“配置文件”。有任何想法吗?
为了进入.NET Core,我创建了一个WEB API,该API可以上传文件,然后将文件中的事务保存到DB表中。我正在使用.NET Core 2和Entity Framework Core。我使用此处的示例创建了上下文。
我的问题是,当尝试将其保存到我的存储库中的上下文对象时,出现错误“ System.ObjectDisposedException无法访问已处置的对象”。这是一个简单的堆栈,所以我希望有人可以帮助我。
我的容器设置如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddDbContext<SyncFinContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddScoped<ITransactionProcessor, TransactionProcessor>();
services.AddScoped<ITransactionRepository, TransactionRepository>();
}
Run Code Online (Sandbox Code Playgroud)
我的DBInitializer也从上面的链接中获得:
public static class DbInitializer
{
public static async Task Initialize(SyncFinContext context)
{
await context.Database.EnsureCreatedAsync();
// Look for any students.
if (context.Transactions.Any())
{
return; // DB has been seeded
}
var ts = new Transaction[]
{
// insert test data here
};
await context.SaveChangesAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
我的数据库上下文:
public class SyncFinContext : DbContext
{
public …Run Code Online (Sandbox Code Playgroud) dependency-injection ioc-container dbcontext entity-framework-core asp.net-core
dbcontext ×10
c# ×5
asp.net-mvc ×2
dbset ×2
savechanges ×2
asp.net-core ×1
fakeiteasy ×1
idisposable ×1
linq ×1
unit-testing ×1
wcf ×1