相关疑难解决方法(0)

是否可以从收集中删除子项并解决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万
查看次数

EF 4.1:从集合中删除子对象不会删除它 - 为什么?

我有一些错误: EF 4:从集合中删除子对象不会删除它 - 为什么?

当我从父母那里删除孩子时,我打电话时删除了孩子SaveChanges(),它会给出以下错误信息:

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

但是使用DbContext和EF 4.1,"context.DeleteObject(recipe)"不存在.

有什么建议吗?

[编辑]

    public void UpdateWithAttributes(Model model, IEnumerable<Entity> entities)
    {
        var modelOriginal = this.unitOfWork.Model.GetById(model.IModel);

        this.unitOfWork.Context.Entry(modelOriginal).CurrentValues.SetValues(model);
        UpdateEntityAttributeAssociations(modelOriginal, entities);

        this.unitOfWork.Commit();
    }

    public void UpdateEntityAttributeAssociations(Model model, IEnumerable<Entity> current)
    {
        unitOfWork.Context.Entry(model).Collection(m => m.Entities).Load();
ICollection<Entity> original = model.Entities; // perhaps .ToList() necessary

        // delete
        if (original != null)
        {
            List<Entity> toDelete = GetToDelete(original, current);

            foreach (Entity originalEntityToDelete in toDelete)
            {
                unitOfWork.Context.Entity.Remove(originalEntityToDelete);
            }
        }

        // add, update
        if (current != null)
        {
            foreach (Entity currentEntity in …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework poco entity-framework-4.1

5
推荐指数
1
解决办法
3948
查看次数

操作失败:无法更改关系,因为一个或多个外键属性不可为空

这些是我的实体:

public class Currency : Exchange
{
     public List<CurrencyPrice> CurrencyPrice { get; set; }
}

public class CurrencyPrice : Price
{
    public int CurrencyId { get; set; }
    [ForeignKey("CurrencyId")]
    public Currency Currency { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我第一次将值插入数据库时​​一切正常,但如果我更改数据库中的任何值并尝试插入或更新记录,我会收到此错误:

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

这是我的插入代码:

var currency =
    UnitOfWork.Exchange.Get(x => x is Currency && x.ExchangeType.Id == exchangeTypeId) as Currency;
if (currency != null)
{
    CurrencyPrice lastPriceValue = UnitOfWork.CurrencyPrice.Last(x => x.CurrencyId == currency.Id);
    if (lastPriceValue == null || lastPriceValue.Value != price)
    {
        currency.CurrencyPrice = new List<CurrencyPrice> …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework

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

识别关系并插入子实体会导致"无法在表中插入标识列的显式值"

我试图让识别关系在Entity Framework中工作,这样我就可以使用Remove删除其集合中的项目.

我创建了一个测试:

public class OrderLine{   
    [Key, Column(Order = 0)]
    public int OrderLineId { get; set; }

    [Key, ForeignKey("Order"), Column(Order = 1)]
    public int OrderId{ get; set; }

    public virtual Order Order{ get; set; }

    [ForeignKey("Product")]
    public int ProductId { get; set; }

    public virtual Product Product { get; set; }

    public int Number { get; set; }}
Run Code Online (Sandbox Code Playgroud)

当我尝试添加OrderLine时:

        var order=_orderRepository.Find(1);
        var NewOrderLine= new OrderLine()
                                            {
                                                Number = 1,ProductId= 2
                                            };
        order.OrderLines.Add(NewOrderLine);
        _orderRepository.InsertOrUpdate(order);
        _orderRepository.Save();
Run Code Online (Sandbox Code Playgroud)

我收到了错误

当IDENTITY_INSERT设置为OFF时,无法在表'OrderLines'中为标识列插入显式值.

当我查看表时,SQL有一个主键,而不是OrderId和OrderLineId.此外,只有OrderLineId被设置为标识.所以它必须尝试插入一个值,但它似乎尝试插入的唯一值是0.

我可以使用以下方法插入表中的任何想法:

INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

entity-framework entity-framework-4.3

4
推荐指数
1
解决办法
1780
查看次数