相关疑难解决方法(0)

识别和非识别关系之间有什么区别?

我无法完全掌握差异.你能描述这两个概念并使用现实世界的例子吗?

database database-design data-modeling identifying-relationship

773
推荐指数
8
解决办法
39万
查看次数

实体框架.Remove()与.DeleteObject()

您可以使用以下两种方法从EF中删除数据库中的项目.

第一个是EntityCollection第二个,第二个是ObjectContext.

什么时候应该使用?

一个优先于另一个吗?

Remove()返回a bool并DeleteObject()返回void.

c# database orm entity-framework

138
推荐指数
2
解决办法
13万
查看次数

EF6.0"由于一个或多个外键属性不可为空,因此无法更改关系"

如果我尝试删除"子"行,我总是会遇到异常.这是一个片段:

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 fluent-interface

30
推荐指数
3
解决办法
4万
查看次数

是否可以从收集中删除子项并解决SaveChanges上的问题?

我们正在使用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

21
推荐指数
1
解决办法
2万
查看次数

ASP.NET MVC/EF4/POCO/Repository - 如何更新关系?

我在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>):
    • RecommendationOne(Recommendation)
    • 推荐二(Recommendation)

如果我在编辑视图中,则已经选中了两个复选框.第三个(代表RecommendationThree)未经检查.

但是,如果我检查该框,上述模型将变为:

评论:

  • 建议(ICollection<Recommendation>):
    • RecommendationOne(Recommendation)
    • 推荐二(Recommendation)
    • 推荐三(Recommendation)

所以我需要将RecommendationThree作为新实体附加到图表中. …

asp.net-mvc repository poco entity-framework-4

13
推荐指数
3
解决办法
9893
查看次数

是否真的不可能在EF中更新子集合(也称为非hacky方式)?

假设您的实体中有这些类.

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,并 …

c# entity-framework entity-framework-6

11
推荐指数
2
解决办法
9921
查看次数

由于一个或多个外键属性在MVC 4中不可为空,因此无法更改该关系

单击保存(更新)我的表单后出现此错误:

由于一个或多个外键属性不可为空,因此无法更改关系.当对关系进行更改时,相关的外键属性将设置为空值.如果外键不支持空值,则必须定义新关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象.

这是我的控制器(案例"保存"在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)

asp.net-mvc entity-framework

10
推荐指数
1
解决办法
3万
查看次数

使用AutoMapper从MVC中的ViewModel更新实体

我有一个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)

c# entity-framework automapper asp.net-mvc-5

9
推荐指数
1
解决办法
4343
查看次数

ASP.NET MVC 3 EF CodeFirst - DBContext项目编辑

我一直对此感到沮丧...请帮忙.

我有一个发票部分,我可以通过使用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

8
推荐指数
1
解决办法
4497
查看次数

由于一个或多个外键属性不可为空,因此无法更改关系

(注意:即使它有相同的例外,这也不是这个问题的重复.)

我有一个穷人的交易策略是:

  1. 插入父记录和子记录.
  2. 执行长时间运行.
  3. 如果长时间运行操作失败,请删除先前插入的父记录和子记录.

当我尝试第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# sql-server .net-4.0 entity-framework-4

8
推荐指数
1
解决办法
9616
查看次数