没有实体ID的重复实体对象

时间:2019-04-22 14:07:27

标签: c# entity-framework

我必须复制一个实体但不复制其ID,然后将新实体视为一个单独的对象。 无法访问我的实体ID的set访问器。因此,我无法修改Id并将其设置为null,现在只允许在数据库中执行AddOrUpdate(基于Id)。 我无法执行简单的添加。 我需要能够复制或克隆不同的实体,所以也许通用函数可以帮助我做到这一点,但是我从何处着迷。 有帮助吗??

1 个答案:

答案 0 :(得分:1)

一种选择是利用Automapper执行浅表克隆。可以将Automapper配置为忽略特定属性(例如ID)或带有无法访问的设置程序的所有属性:

所以给定一个像这样的实体:

public class SomeObject
{
    public int SomeId { get; private set; }
    public string Name { get; set; }

    public SomeObject(int? id = null)
    {
        if (id.HasValue)
            SomeId = id.Value;
    }
}

您可以这样配置映射器:

        var mapperConfig = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<SomeObject, SomeObject>().IgnoreAllPropertiesWithAnInaccessibleSetter();
        });
        IMapper mapper = new Mapper(mapperConfig);

        var test = new SomeObject(1) { Name = "Fred" }; // object we will clone.
        var test2 = new SomeObject(); // example of an existing "new" object to copy values into...
        mapper.Map(test, test2); // Copy values from first into 2nd..
        var test3 = mapper.Map<SomeObject>(test); // Example of letting automapper create a new clone.

在两种情况下,都没有复制ID列。您可能想使用“ test2”示例来利用context.Entities.Create来为新实体创建新的跟踪代理,尽管EF在将实体添加到Entities DbSet中的情况下,可以很好地与实体的新POCO实例配合使用。 / p>