【问题标题】:EF 6.0 Code First: Multiplicity constraint violated. the role of the relationshipEF 6.0 Code First:违反多重性约束。关系的作用
【发布时间】:2014-08-22 12:43:55
【问题描述】:

很多人已经问过几乎类似的问题,但我可以从这些问题和答案中找出我的问题。所以这是我的问题

我想要什么:

一次性插入和更新同一实体类型的不同实例。

我做了什么:

我的实体:

public partial class Record
{
    public long Id { get; set; }
    public string Name { get; set; }
    .....
    .....
}

我尝试了什么:

下面的函数将做的是更新传递的客户端并从中进行深层复制并尝试另存为新副本。

private void CreateRecord(Record data)
{
     // Update
     _dbSet.Attached(data);  /*OR*/ // _dbSet.Entry(client).State = EntityState.Modified;   

    // Insert Copy
    var newData= data.DeepCopy(); // DeepCopy is custom extension function
    newData.Id = 0;
    _dbSet.Add(newData);

    context.SaveChanges();
}

// Invoking above function

CreateRecord(new Record(){Name="xyz", Id =123 });

【问题讨论】:

    标签: c# entity-framework c#-4.0 ef-code-first


    【解决方案1】:

    只是为了让您的问题正确,您的解决方案不起作用?

    首先,您能否将 DeepCopy() 函数添加到您的问题中?

    也尝试更改更新实体的状态(两者都不像您的解决方案“OR”):

    Context.Entry(entityToUpdate).State = EntityState.Modified;
    

    另一种解决方案是:

    private void CreateRecord(Record data)
    {
         // Update
         _dbSet.Attached(data); 
         context.Entry(data).State = EntityState.Modified;   
    
        // Insert Copy
        var newData = new Record();
        newData.Name = data.Name;
        _dbSet.Add(newData);
    
        context.SaveChanges();
    }
    

    ID 将由框架/数据库自动添加,因为它是主键。由于它的名称(“id”),它将自动递增且唯一。

    【讨论】:

    • 你可以修改你的 DeepCopy() 让它只复制非主要属性。
    • 谢谢@Olli1511 我也尝试了你建议的方式,使用附加和更改状态,但不幸的是没有工作:( 关于 DeepCopy() 我只是想传达一个插入新实例但有相同的消息信息。我尝试创建一个实例并手动分配属性。即使这样也不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多