我无法完全掌握差异.你能描述这两个概念并使用现实世界的例子吗?
database database-design data-modeling identifying-relationship
您可以使用以下两种方法从EF中删除数据库中的项目.
第一个是EntityCollection第二个,第二个是ObjectContext.
什么时候应该使用?
一个优先于另一个吗?
Remove()返回a bool并DeleteObject()返回void.
如果我尝试删除"子"行,我总是会遇到异常.这是一个片段:
using (var context = new CompanyContext())
{
ItemType itemType = context.ItemTypes.FirstOrDefault(i => i.Name == "ServerType");
ItemTypeItem itemTypeItem = itemType.Items.FirstOrDefault(i => i.Name == "DatabaseServer");
itemType.Items.Remove(itemTypeItem);
context.SaveChanges(); <=== exception!
}
Run Code Online (Sandbox Code Playgroud)
该SaveChanges()方法抛出以下异常.
"由于一个或多个外键属性不可为空,因此无法更改关系.当对关系进行更改时,相关的外键属性将设置为空值.如果外键是如果不支持空值,则必须定义新关系,必须为foreign-key属性分配另一个非空值,或者必须删除不相关的对象."
实体配置
public class ItemTypeConfiguration : NamedEntityConfiguration<ItemType>
{
public ConfigurationColumn ParentIDColumn;
public ConfigurationColumn ValidationPatternColumn;
public ItemTypeConfiguration() : base()
{
ParentIDColumn = new ConfigurationColumn() { Name = "ParentID", Ordinal = base.LastOrdinalPosition + 1 };
ValidationPatternColumn = new ConfigurationColumn() { Name = "ValidationPattern", Length = 1024, Ordinal=base.LastOrdinalPosition + 2};
this.Property(t …Run Code Online (Sandbox Code Playgroud) 我们正在使用Entity Framework Code First和Foreign Key关系.我们正在调查处理从应用程序中的实体ICollection中删除对象的方法.
当我们有一个具有子关系的实体时,我们可以使用Add方法将对象直接添加到他们的ICollection中.现在,当您使用删除时,您会收到错误
发生System.InvalidOperationException消息=操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我理解这是因为集合上的Remove仅通过归零外键来删除关系.我们想在我们的实体中编写业务逻辑并允许删除.
所以从它的Repostiory中取出root实体,例如OrderRepository的Order然后调用实体的一些特定方法,例如,Order.AddOrderline(Orderline orderline)这将OrderLine添加到Ordersvirtual ICollection<OrderLine> OrderLines
但是,我们无法编写代码,Order.CancelOrderline(int orderLineId)因为只是从ICollection中删除会导致存储更改出错.
似乎没有任何方法可以通过操纵对象集合来实现这一点.显然我们可以直接从Context中删除.但是我想把它作为实体的一部分.我们可以在Entity Framework的SaveChanges事件中清除没有外键的某些实体吗?显然需要告诉EF如果它们具有空外键,可以删除哪些实体.
我们目前正在使用存储库模式,因此控制器无法访问上下文.我显然可以在Order存储库上使用OrderLine存储库或删除OrderLine方法.然而,只是想知道是否有可能在实体上编写代码而不引用持久性机制.
思考?我们这一切都错了吗?其他ORM是否允许您从Child Collections中删除?
persistence entity-framework repository-pattern entity-framework-4
我在Review和Recommendations之间有一个*..*的关系.
我模型的相关部分(也是EF4映射的POCO):
public class Review
{
public ICollection<Recommendations> Recommendations { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在编辑视图中,我将建议书表示为一组复选框.
当我尝试添加新建议书作为编辑评论的一部分时(例如,检查另一个框),什么也没发生 - 我知道为什么......
我使用"存根技术"来更新我的实体 - 例如,我创建一个具有相同密钥的实体,将其附加到图形,然后执行ApplyCurrentValues.但这仅适用于标量属性,而不适用于导航属性.
我发现这个StackOverflow问题看起来不错,但我正在尝试弄清楚如何使用POCO的/ Repository(以及ASP.NET MVC - 分离的上下文).
由于我使用POCO的我,review.Recommendations是一个ICollection<Recommendation>,所以我不能这样做review.Recommendations.Attach.我也没有使用自我跟踪实体,所以我需要手动处理图形/更改跟踪 - 这一直到现在都不是问题.
所以你可以想象这个场景:
评论:
ICollection<Recommendation>):
Recommendation)Recommendation)如果我在编辑视图中,则已经选中了两个复选框.第三个(代表RecommendationThree)未经检查.
但是,如果我检查该框,上述模型将变为:
评论:
ICollection<Recommendation>):
Recommendation)Recommendation)Recommendation)所以我需要将RecommendationThree作为新实体附加到图表中. …
假设您的实体中有这些类.
public class Parent
{
public int ParentID { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public int ChildID { get; set; }
public int ParentID { get; set; }
public virtual Parent Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且您有一个用户界面来更新Parent它Children,这意味着如果用户添加新的,Child那么您必须插入,如果用户编辑现有的Child则需要更新,如果用户删除了Child则必须删除.现在很明显,如果您使用以下代码
public void Update(Parent obj)
{
_parent.Attach(obj);
_dbContext.Entry(obj).State = EntityState.Modified;
_dbContext.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
它将无法检测到内部的更改,Child因为EF无法检测到导航属性中的更改.
我一直在问这个问题4次,得到的答案很复杂.那么实际上可以做到这一点而不会变得复杂吗?这个问题可以通过分离之间的用户界面解决问题Parent和Child,但我不想因为两者合并Child,并 …
单击保存(更新)我的表单后出现此错误:
由于一个或多个外键属性不可为空,因此无法更改关系.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
这是我的控制器(案例"保存"在swich couse问题):
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(UserModel userModel, string act = null, int idx = 0)
{
using (var dbContext = new userDbEntities())
{
if (userModel.User == null)
{
userModel.User = new UsersTable();
}
var newUser = userModel.User.userID == 0;
userModel.CustomTypes = dbContext.CustomTypes.ToList();
switch (act)
{
case "addcustom":
userModel.User.CustomerTables.Add(new CustomerTable
{
CustomType = new CustomType(),
UsersTable = userModel.User
});
break;
case "deletecustom":
userModel.User.CustomerTables.RemoveAt(idx);
break;
case "save":
foreach (var customer in userModel.User.CustomerTables)
{
customer.CustomType = dbContext.CustomTypes.Find(customer.CustomType.Id_NewCustomerType);
}
var dbUser …Run Code Online (Sandbox Code Playgroud) 我有一个Supplier.cs实体及其ViewModel SupplierVm.cs.我正在尝试更新现有供应商,但我收到黄色死亡屏幕(YSOD),并显示错误消息:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我想我知道它为什么会发生,但我不知道如何解决它.这是一个关于正在发生的事情的截屏视频.我认为我得到错误的原因是因为当AutoMapper做它的事情时,这种关系就会丢失.
码
以下是我认为相关的实体:
public abstract class Business : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
public string TaxNumber { get; set; }
public string Description { get; set; }
public string Phone { get; set; }
public string Website { get; set; }
public string Email { get; set; }
public bool IsDeleted { get; …Run Code Online (Sandbox Code Playgroud) 我一直对此感到沮丧...请帮忙.
我有一个发票部分,我可以通过使用JQuery附加/删除DOM元素来动态添加新项目...我已经找到了如何正确命名这些元素,因此它们因此正确地映射到模型并发送到action参数.
所以,假设我的控制器中有一个名为Edit with Invram类型为Invoice的动作
[HttpPost]
public virtual ActionResult Edit(Invoice invoice) {
if (ModelState.IsValid) {
//code discussed below
}
return RedirectToAction("Index");
}
Run Code Online (Sandbox Code Playgroud)
invoice参数包含我想要的所有数据.我对此没有任何问题.以下是对象模型.
public class Invoice
{
[Key]
public int ID { get; set; }
public InvoiceType InvoiceType { get; set; }
public string Description { get; set; }
public int Amount { get; set; }
public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意InvoiceItems集合 - 它包含动态插入的发票项目的集合.以下是InvoiceItem模型
[Table("InvoiceItems")]
public class InvoiceItem
{
[Key]
public int ID { …Run Code Online (Sandbox Code Playgroud) asp.net entity-framework ef-code-first asp.net-mvc-3 dbcontext
我有一个穷人的交易策略是:
当我尝试第3步时,收到以下消息:
操作失败:无法更改关系,因为一个或多个外键属性不可为空.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.
我一般都明白这意味着什么,但我认为我是按照规则玩的,无论我怎么努力遵守规则,我都不确定为什么我会得到这个消息.
我们使用自我跟踪实体,我的代码实际上是这样的:
var parent = new Parent(1,2,3);
var child = new Child(4,5,6);
parent.Children.Add(child);
MyContext.Parents.ApplyChanges(parent);
MyContext.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
// At this point, inserts were successful and entities are in an Unchanged state.
// Also at this point, I see that parent.Children.Count == 1
var shouldDeleteEntities = false;
try
{
// This is not database-related. This process does some
// encryption/decryption and uploads some files up to
// …Run Code Online (Sandbox Code Playgroud) c# ×4
asp.net-mvc ×2
database ×2
.net-4.0 ×1
asp.net ×1
automapper ×1
dbcontext ×1
orm ×1
persistence ×1
poco ×1
repository ×1
sql-server ×1