我在我的数据模型中实现了一些每个类型的表继承(基本上有一个BaseEntity类型,包含我的项目的所有基本信息和Employer从BaseEntity项目继承的类型).一切似乎都是正确设置的,当使用实体时(通过ADO.net数据服务或通过Linq到实体)我可以看到Employer类型和事情看起来没问题.当我创建一个新Employer实体并尝试保存它时,问题就开始了.
在看起来不是.AddToEmployer项目的上下文中(仅和/ AddObject或AddToBaseEntity).
如果我使用AddObject("Employer", NewEmployer)我得到和错误消息:
找不到EntitySet名称'DataEntities.Employer'.
如果我使用,AddToBaseEntity(NewEmployer)我会收到以下错误消息:
无法确定相关操作的有效排序.由于外键约束,模型要求orstore生成的值可能存在依赖关系.
我是否错过了设置继承的步骤?是否有一些特定的方法来保存继承的对象?我究竟做错了什么?我认为基本问题是我应该有一个AddToEmployer,我需要做些什么来暴露它?看起来很奇怪它不是一个选项,因为我可以在客户端看到雇主类型并且可以执行以下操作:
var NewEmployer = new Employer() - 这似乎表明我可以看到雇主类型罚款.
.net inheritance entity-framework savechanges table-per-type
如何在WPF中覆盖WndProc?当我的窗口关闭时,我尝试检查我正在使用的文件是否被修改,如果是这样,我必须向用户提示"你想保存更改吗?" 消息,然后关闭正在使用的文件和窗口.但是,当我的窗口仍然打开时,我无法处理用户重新启动/关闭/注销时的情况.我无法覆盖WndProc,因为我正在使用WPF进行开发.我也试过使用这个示例MSDN代码.这就是我所做的private void loadedForm(对象发送者,RoutedEventArgs e){
HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
source.AddHook(new HwndSourceHook(WndProc));
}
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_QUERYENDSESION.)
{
OnWindowClose(this, new CancelEventArgs())
handled = true;
shutdown = true;
}
return IntPtr.Zero;
}
private void OnWindowClose(object sender, CancelEvetArgs e)
{
if (modified)
{
//show message box
//if result is yes/no
e.cancel = false;
//if cancel
e.cancel = true;
}
}
Run Code Online (Sandbox Code Playgroud)
在XAML文件上,我也使用Closing = "OnWindowClose"但是当我单击是/否时没有任何反应,我的应用程序没有关闭.如果我尝试使用关闭按钮再次关闭它,我收到一个错误?为什么会这样?是因为胡克?WPF中的等价物是什么?
private …Run Code Online (Sandbox Code Playgroud) 我在Java Web应用程序(JSF1.2,RichFaces)中创建了一些"保存"bean功能.它使用JAXB将其转换为XML字符串,然后将其存储在数据库中.如果用户将其加载回来,我想通知用户是否更改了(bean)内容并且应该再次保存.
我的想法是覆盖hashCode()'with'函数org.apache.commons.lang.builder.HashCodeBuilder,但是我有很多字段和子元素.有没有其他方法来处理这种功能?
编辑
"比较"是在另一个视图上完成的!
任何帮助,将不胜感激!
我的超市模型包含一个StockItem类和一个包含StockItem字段的Alert类:
public class StockItem
{
public int ID { get; set; }
public string Name { get; set; }
public int CurrentQuantity { get; set; }
public int MinQuantity { get; set; }
}
public class Alert
{
public int ID { get; set; }
public int Message{ get; set; }
public virtual StockItem StockItem { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有一个函数,用一个DbContext获取所有StockItems:
using (var db = new MyDbContext())
{
return db.StockItems.ToList();
}
Run Code Online (Sandbox Code Playgroud)
另一个处理这些项目的函数,以及在另一个DbContext中添加新的警报:
foreach (var item in items)
{
if (item.CurrentQuantity …Run Code Online (Sandbox Code Playgroud) 我正在使用ADO.NET实体框架构建ASP.NET MVC站点.我有一个包含这些实体的实体模型,由外键关联:
报告(ID,日期,标题,Report_Type_ID等)
每种类型的SubReport都有一个Create.aspx页面.post事件方法返回一个新的Sub_Report实体.
以前,在我的post方法中,我遵循了这个过程:
这个工作流程成功完成了几周.然后上周发生了一些变化,它不再起作用了.现在取代了保存操作,我得到了这个例外:
UpdateException: "Entities in 'DIR2_5Entities.ReportSourceSet' participate in the 'FK_ReportSources_ReportSourceTypes' relationship. 0 related 'ReportSourceTypes' were found. 1 'Report_Source_Types' is expected."
调试可视化工具显示以下内容:
在SQL事件探查器中,准备好的SQL语句看起来不错.任何人都可以指出我错过了哪些显而易见的事情?
TIA
注意:在这种情况下,Report和SubReport始终是新实体.报表实体包含许多类型报表共有的属性,用于通用查询.子报告是具有不同类型的额外参数的特定报告.实际上每种类型的SubReport都有不同的实体集,但这个问题适用于所有这些,所以我使用SubReport作为简化示例.
我正在尝试使用以下代码将实体保存到我的数据库:
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) 我已经搜索了谷歌并且花了很多时间试图弄清楚我的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[]数组.现在你可以看到,每次初始化数组都会成为编码的痛苦.
任何想法的人?提前致谢.
我正在使用Entity Framework 4.1构建一个ASP.Net MVC 3 Web应用程序.我正在使用Database First方法.
我还使用了ADO.NET DbContext Generator来创建POCO类,而不是使用自动生成的实体对象.当您使用ADO.NET DbContext Generator时,它将创建两个新项,一个.tt文件,为每个实体生成POCO类,还有一个.Context.tt文件,生成派生的DbContext类(用于查询和保存数据).
在我的应用程序中,我编写了代码来执行特定实体的审计,此代码在我创建的覆盖SaveChanges()方法内执行.我已将此覆盖SaveChanges()方法放在Context.cs类中,如下所示,它可以很好地工作
public partial class LocumEntities : DbContext
{
public LocumEntities()
: base("name=LocumEntities")
{
}
public override int SaveChanges()
{
//Audit Code Executes in Here
return base.SaveChanges();
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
public DbSet<Audit> Audits { get; set; }
public DbSet<Form> Forms { get; set; }
//Other DbSets
}
Run Code Online (Sandbox Code Playgroud)
但是,无论何时我甚至在EDMX图中 …
overriding savechanges edmx entity-framework-4.1 asp.net-mvc-3
我正在尝试将Entity Framework 4用于我正在编写的小型数据库应用程序,以便记录下载的文件.在运行应用程序时,我在tableName.Add()方法之后设置了一个断点,在.SaveChanges()方法之前,我可以看到保存到实体中的数据; 然后在调用.SaveChanges()方法之后我有另一个断点,并查看数据库以查找没有保存的记录.我发现了很多类似的问题,但我没有找到解决我特定问题的方法.这是代码:
public void StartNewDownload(string FileID)
{
DateTime startTime = DateTime.Now;
FilesDBEntities db = new FilesDBEntities();
int startedID = (from dr in db.tblDownloadResults
where dr.Value.Equals("Started")
select dr.ResultID).First();
tblDownloads myDownload = new tblDownloads { FileID = FileID, StartDateTime = startTime, ResultID = startedID };
db.tblDownloads.Add(myDownload);
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏.
谢谢!
如果这似乎是一个重复的问题,请提前道歉.这个问题是我能找到的最接近的问题,但它并没有真正解决我所面临的问题.
我在ASP.NET MVC4应用程序中使用Entity Framework 5并尝试实现工作单元模式.
我的工作单元类实现IDisposable并包含我的 - DbContext派生对象上下文类的单个实例,以及许多存储库,每个存储库都派生一个通用基础存储库类,它公开了所有常见的存储库功能.
对于每个HTTP请求,Ninject创建Unit of Work类的单个实例并将其注入控制器,并在请求完成时自动处理它.
由于EF5抽象出数据存储并且Ninject管理对象上下文的生命周期,因此它似乎是使用代码访问内存中实体对象而不需要明确管理其持久性的完美方式.换句话说,为了最佳地分离关注点,我设想我的控制器操作方法能够使用和修改存储库数据,而无需SaveChanges事后显式调用.
我实现这个想法的第一次(naiive)尝试SaveChanges在每个修改数据的存储库基类方法中调用.当然,我很快就意识到这不是性能优化的(特别是在对同一方法进行多次连续调用时),也不适应动作方法直接修改从存储库检索的对象的属性的情况.
所以,我改进了我的设计,以消除这些过早的调用,SaveChanges并在处理工作单元实例时用一个调用替换它们.这似乎是MVC中工作单元模式最干净的实现,因为工作单元自然是作用于请求的.
不幸的是,在构建了这个概念之后,我发现了它的致命缺陷 - 事实上,添加到或删除的对象在被调用之前DbContext都不会被反射,甚至在本地也不会被反射SaveChanges.
那么,您对消费代码应该能够使用对象而不明确地持久化它的想法有何看法?而且,如果这个想法似乎有效,那么用EF5实现它的最佳方法是什么?
非常感谢你的建议,
蒂姆
更新:根据@ Wahid的回复,我在下面添加了一些测试代码,其中显示了消费代码显式调用必不可少的一些情况SaveChanges:
var unitOfWork = _kernel.Get<IUnitOfWork>();
var terms = unitOfWork.Terms.Entities;
// Purge the table so as to start with a known state
foreach (var term in terms)
{
terms.Remove(term);
}
unitOfWork.SaveChanges();
Assert.AreEqual(0, terms.Count());
// Verify that additions are …Run Code Online (Sandbox Code Playgroud) entity-framework savechanges unit-of-work repository-pattern asp.net-mvc-4
savechanges ×10
dbcontext ×2
.net ×1
c# ×1
edmx ×1
entity ×1
hashcode ×1
inheritance ×1
java ×1
linq ×1
overriding ×1
shutdown ×1
unit-of-work ×1
wcf ×1
wndproc ×1
wpf ×1