EF Core 2.2导航属性创建重复项

时间:2019-08-19 11:58:15

标签: c# entity-framework ef-code-first ef-core-2.2

对于现有博客实体,我要添加一个新帖子,并使用B 日志作为导航属性。错误是正在插入重复博客。使用 EF Core 2.2

class MyContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Post>()
            .HasOne(p => p.Blog)
            .WithMany(b => b.Posts)
            .HasForeignKey(p => p.BlogId);
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }

    public List<Post> Posts { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

PostFactory.cs

  public Post CreateNew(Guid id)
    {
        var post = new Post(id);

        return post;
    }

PostService.cs

   public Post Create(Guid blogId)
    {
        var blog = _context.Blogs.Include(t=>t.Posts).FirstOrDefault(x => x.Id == blogId);

        var postFactory = new PostFactory();
        var post = postFactory.CreateNew(Guid.NewGuid());

        post.Blog = blog;
        post.BlogId = blogId;

        blog.Posts.Add(post);
        _context.SaveChanges();
        return post;
    }

不确定为什么要再次尝试将现有Blog插入数据库。我收到错误消息:

违反PRIMARY KEY约束“ PK_Blogs”。无法在对象'dbo.Blogs'

中插入重复的密钥

1 个答案:

答案 0 :(得分:0)

您应该在帖子中分配blogId或将帖子添加到博客,我相信两者都会给您带来意想不到的结果,请尝试以下操作:

/******SERVER******/

struct in_addr localInterface;
struct sockaddr_in groupSock;
int sd;

char databuf[10] = "balblabla";

int main (int argc, char *argv[ ])
{

   sd = socket(AF_INET, SOCK_DGRAM, 0);
   if(sd < 0)
   {
      perror("Opening datagram socket error");
      exit(1);
   }
   else
      printf("Opening the datagram socket...OK.\n");


   memset((char *) &groupSock, 0, sizeof(groupSock));
   groupSock.sin_family = AF_INET;
   groupSock.sin_addr.s_addr = inet_addr("226.1.1.1");
   groupSock.sin_port = htons(4321);


   localInterface.s_addr = inet_addr("192.168.2.2");
   if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0)
   {
      perror("Setting local interface error");
      exit(1);
   }
   else
      printf("Setting the local interface...OK\n");

   reloop:
   if(sendto(sd, databuf, datalen, 0, (struct sockaddr*)&groupSock, sizeof(groupSock)) < 0)
   {      
      perror("Sending datagram message error");
   }
   else
      printf("Sending datagram message...OK\n");
   sleep(1);

   goto reloop;

   return 0;
}