为了账号安全,请及时绑定邮箱和手机立即绑定

没有 Id 的重复实体对象

没有 Id 的重复实体对象

C#
阿波罗的战车 2022-12-24 14:01:18
我必须复制一个实体而不是它的 Id,然后将新实体视为一个单独的对象。我的实体 ID 的设置访问器不可访问。所以我不能修改 Id 并将其设置为 null,现在我只能在数据库中执行 AddOrUpdate(基于 Id)。我不能做一个简单的添加。我需要能够复制或克隆不同的实体,所以也许通用函数可以帮助我做到这一点,但我不知道从哪里开始。有什么帮助吗?
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

一种选择是利用 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 可以很好地处理实体的新 POCO 实例,前提是将其添加到实体 DbSet。


查看完整回答
反对 回复 2022-12-24
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信