首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQLite错误19:“唯一约束失败:PosterDto.Id”

SQLite错误19:“唯一约束失败:PosterDto.Id”
EN

Stack Overflow用户
提问于 2021-07-30 15:49:59
回答 1查看 690关注 0票数 0

当我试图发布新的项目时,下面的事情就会发生。在本文中,应用程序使用中介器作为API。

  1. 查找实际记录的用户,
  2. 创建新的海报对象(以减少发送给DB的数据,并提供有关创建新项目的信息),
  3. 创建项目
  4. Update DB

的新对象

在邮递员中,有一个错误:

代码语言:javascript
运行
复制
"errors": "An error occurred while updating the entries. See the inner exception for details."

当我检查终端时,会出现更具体的错误:

代码语言:javascript
运行
复制
SQLite Error 19: 'UNIQUE constraint failed: PosterDto.Id'.

PosterDTO:

代码语言:javascript
运行
复制
public class PosterDto
{
        public string Id { get; set; }
        public string DisplayName { get; set; }
        public string Username { get; set; }
        public string Photo { get; set; }
}

项目:

代码语言:javascript
运行
复制
public class Item
{
        public Guid Id { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime Date { get; set; }
        public double Latitude { get; set; }
        public double Longitude { get; set; }
        public string Image { get; set; }
        public PosterDto Poster { get; set; }
        public ICollection<Message> Messages { get; set; } = new List<Message>();
}

创建项目类:

代码语言:javascript
运行
复制
public class Create
    {
        public class Command : IRequest 
        {
            public Guid Id { get; set; }
            public string Title { get; set; }
            public string Description { get; set; }
            public DateTime Date { get; set; }
            public double Latitude { get; set; }
            public double Longitude { get; set; }
            public string Image { get; set; }
        }

        public class Validator : AbstractValidator<Command>
        {
            public Validator()
            {
                RuleFor(x => x.Id).NotEmpty();
                RuleFor(x => x.Title).NotEmpty().WithMessage("Please specify a title");
                RuleFor(x => x.Description).NotEmpty().WithMessage("Please specify a description");
                RuleFor(x => x.Latitude).NotEmpty();
                RuleFor(x => x.Longitude).NotEmpty();
            }
        }

        public class Handler : IRequestHandler<Command>
        {
            private readonly DataContext _context;
            private readonly UserManager<AppUser> _userManager;
            private readonly IUserAccessor _userAccessor;

            public Handler(DataContext context, UserManager<AppUser> userManager, IUserAccessor userAccessor)
            {
                _context = context;
                _userManager = userManager;
                _userAccessor = userAccessor;
            }

            public async Task<Unit> Handle(Command request, CancellationToken cancellationToken)
            {
                var user = await _userManager.FindByNameAsync(_userAccessor.GetCurrentUsername());

                if (user == null)
                {
                    throw new RestException(HttpStatusCode.Unauthorized, new { user = "Not found" });
                }

                var poster = new PosterDto
                {
                    Id = user.Id,
                    DisplayName = user.DisplayName,
                    Username = user.UserName,
                    Photo = user.Photo
                };

                var item = new Item
                {
                    Id = request.Id,
                    Title = request.Title,
                    Description = request.Description,
                    Date = DateTime.Now,
                    Latitude = request.Latitude,
                    Longitude = request.Longitude,
                    Image = request.Image,
                    Poster = poster
                };

                _context.Items.Add(item);

                var success = await _context.SaveChangesAsync() > 0;

                if (success)
                {
                    return Unit.Value;
                }

                throw new NotImplementedException("Error");
            }
        }
    }

ItemsController:

代码语言:javascript
运行
复制
[HttpPost]
public async Task<ActionResult<Unit>> Create(Create.Command command)
{
    return await _mediatR.Send(command);
}
EN

回答 1

Stack Overflow用户

发布于 2021-07-30 16:48:46

您遇到的问题与实体框架有关。我想你是先使用代码了。

代码语言:javascript
运行
复制
public class Item
{       
   // Entity Framework will create a relationship between PosterDto and Item 
    public PosterDto Poster { get; set; }
}

实体框架将在PosterDto和Item之间创建一个关系。要防止EntityFramework这样做,请将属性NotMapped添加到PosterDto属性中。

代码语言:javascript
运行
复制
public class Item
{       
   // Add NotMapped Attribute
    [NotMapped]
    public PosterDto Poster { get; set; }
}

看一下这篇文章https://www.learnentityframeworkcore.com/configuration/data-annotation-attributes/notmapped-attribute

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68593791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档