gpt4 book ai didi

c# - EFCore - 如何将多个导航属性设置为同一类型?

转载 作者:行者123 更新时间:2023-11-30 16:39:01 31 4
gpt4 key购买 nike

我的模型包含 Post 和 PostHistory 类,其中 Post 与 PostHistory 具有一对多关系。

class Post
{
public int Id { get; set; }

public PostVersion CurrentVersion { get; set; }
public PostVersion OriginalVersion { get; set; }
public IList<PostVersion> History { get; set; }
}

class PostVersion
{
public int Id { get; set; }
public Post Post { get; set; }

public string Title { get; set; }
public string Body { get; set; }
}

History 属性包含与该帖子相关的所有 PostVersions 的列表。 CurrentVersion 和 PreviousVersion 属性都引用该帖子历史记录中的特定版本(最有可能是最新版本和第一个版本)。

我的问题是 EF Core 很难理解由于 CurrentVersion 和 OriginalVersion 导航属性引起的关系。当我尝试创建迁移时,收到此错误消息:

Unable to determine the relationship represented by navigation property 'Post.CurrentVersion' of type 'PostVersion'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.

之后,我尝试使用 Fluent API 手动创建关系。

protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);

builder.Entity<Post>()
.HasMany(x => x.History)
.WithOne(x => x.Post);
builder.Entity<Post>()
.HasOne(x => x.CurrentVersion)
.WithOne(x => x.Post);
builder.Entity<Post>()
.HasOne(x => x.OriginalVersion)
.WithOne(x => x.Post);
}

但产生了不同的错误:

Cannot create a relationship between 'PostVersion.Post' and 'Post.CurrentVersion', because there already is a relationship between 'Post.History' and 'PostVersion.Post'. Navigation properties can only participate in a single relationship.

是否可以在 EF Core 代码优先中创建这种关系?

最佳答案

编辑我做了一些更改,您不能在多个关系中引用相同的属性。因此我不得不使用外键进行映射。 PostVersion 只有一个您需要的Post 引用。

public class Post
{
public Guid Id { get; set; }

public Guid CurrentVersionId { get; set; }
public PostVersion CurrentVersion { get; set; }
public Guid OriginalVersionId { get; set; }
public PostVersion OriginalVersion { get; set; }
public IList<PostVersion> History { get; set; }
}

public class PostVersion
{
public Guid Id { get; set; }
public Guid PostId { get; set; }

public Post Post { get; set; }

public string Title { get; set; }
public string Body { get; set; }
}

modelBuilder.Entity<Post>()
.HasOne(x => x.CurrentVersion)
.WithOne()
.HasForeignKey<Post>(p => p.CurrentVersionId);
modelBuilder.Entity<Post>()
.HasOne(x => x.OriginalVersion)
.WithOne()
.HasForeignKey<Post>(p => p.OriginalVersionId);

modelBuilder.Entity<Post>()
.HasMany(x => x.History)
.WithOne(p => p.Post)
.HasForeignKey(pv => pv.PostId);

原创您需要为第二个关系指定额外的属性

public class Post
{
public Guid Id { get; set; }

public PostVersion CurrentVersion { get; set; }
public PostVersion OriginalVersion { get; set; }
public IList<PostVersion> History { get; set; }
}

public class PostVersion
{
public Guid Id { get; set; }
public Post Post { get; set; }
public Post SecondPost { get; set; }
public Post ThirdPost { get; set; }

public string Title { get; set; }
public string Body { get; set; }
}


modelBuilder.Entity<Post>()
.HasOne(x => x.CurrentVersion)
.WithOne(x => x.Post);
modelBuilder.Entity<Post>()
.HasOne(x => x.OriginalVersion)
.WithOne(x => x.SecondPost);
modelBuilder.Entity<Post>()
.HasMany(x => x.History)
.WithOne(x => x.ThirdPost);

关于c# - EFCore - 如何将多个导航属性设置为同一类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792548/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com