.net 在影子中创建外键并将随机数1附加到列名- ASP:NET EF核心

qncylg1j  于 2022-12-14  发布在  .NET
关注(0)|答案(5)|浏览(120)

当我迁移我的新模型和数据时,我得到了以下关于多个外键的错误:
外键属性“InsurancePolicy.InsuranceSubjectID1”是在阴影状态下创建的,因为实体类型中存在简单名称为“InsuranceSubjectID”的冲突属性,但该属性未Map、已用于其他关系或与关联的主键类型不兼容。
奇怪的是,我在所有模型中定义的关系都是一样的,但有些工作正常(没有1的FK被存储),有些则不行。
我的模型示例:

public class InsurancePolicy
{
    public int InsurancePolicyID { get; set; }
    [DataType(DataType.Currency)]
    [Column(TypeName = "money")]
    public decimal FinalSum { get; set; }
    public DateTime DateFrom { get; set; }
    public DateTime DateTo { get; set; }
    public int? InsuredID { get; set; }
    public Insured? Insured { get; set; }
    public int? InsuranceSubjectID;
    public InsuranceSubject? InsuranceSubject { get; set; }
    public int? InsuranceSubtypeID;
    public InsuranceSubtype? InsuranceSubtype { get; set; }
}

public class InsuranceSubject
{
    public int InsuranceSubjectID { get; set; }
    [Required]
    [StringLength(50)]
    public string Title { get; set; }
    public string Description { get; set; }
    [DataType(DataType.Currency)]
    [Column(TypeName = "money")]
    public decimal EstimatedValue { get; set; }
    public int? InsuredID;
    public Insured? Insured;
    public int? InsuranceSubjectTypeID { get; set; }
    public InsuranceSubjectType? InsuranceSubjectType { get; set; }
    public ICollection<InsurancePolicy>? InsurancePolicies { get; set; }
}

我试着在代码中去掉外键属性,只留下引用导航属性(删除了int并留下了对象),它工作正常,但是我需要FK int用于将来的实现。
下面是GitHub repo链接,以了解更多信息(分支模型-扩展):https://github.com/lenartgolob/Insurance-IS/tree/model-extension

6psbrbz9

6psbrbz91#

好吧...为了我。
我有亲子关系。
我已经为父代FK输入了标量,并且定义了标量FK“int”的ormMap。

public class MyParent
{
    public int MyParentKey { get; set; }

    public ICollection<MyChild> MyKids { get; set; }

}

public class MyChild
{
    public int MyChildKey { get; set; }

    public int MyParentKey { get; set; } /* FK Scalar */

    public MyParent TheMyParent { get; set; }

}

我已经将MyParentKeyMap到MyChildOrmMap上。
但是我没有对“我的父母”进行ormMap。
一旦我为TheMyParent和相互的MyKids编写了1:N关系,错误就消失了。
也就是说,我错过了下面的代码(下面的代码将在MyChildMap(流畅的ormMap)中)

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

        builder.HasOne<MyParent>(me => me.TheMyParent)
            .WithMany(parent => parent.MyKids)
            .HasForeignKey(me => me.MyParentKey)
            .HasConstraintName("FK_MyChild_To_MyParent_MyParentKey");
whitzsjs

whitzsjs2#

我在引用导航属性前面添加了public virtual,它解决了这个问题。

1hdlvixo

1hdlvixo3#

对我来说,问题是FK部分中的属性ID类型与PK实体部分中的类型不同:

[Range(1, int.MaxValue, ErrorMessage = "Please provide valid payment id")]
    public int PaymentId { get; set; } // NOTICE INT HERE SHOULD BE LONG

    public virtual Payment Payment { get; set; }

其中付款具有ID的long属性:

public class Payment {
 public long Id {get;set;}
 //...
}

mnowg1ta

mnowg1ta4#

对我来说是我错误地引用了同一个实体两次:

modelBuilder.Entity<ProductCategoryProduct>()
            .HasKey(tl => new {tl.ProductCategoryId, tl.ProductId});
        modelBuilder.Entity<ProductCategoryProduct>()
            .HasOne(t => t.ProductCategory)
            .WithMany(t => t.ProductCategoryProducts)
            .HasForeignKey(t => t.ProductCategoryId)
            .OnDelete(DeleteBehavior.Restrict);
        modelBuilder.Entity<ProductCategoryProduct>()
            .HasOne(p => p.ProductCategory) // this should be Product
            .WithMany(p => p.ProductCategoryProducts)
            .HasForeignKey(p => p.ProductId)
            .OnDelete(DeleteBehavior.Restrict);
9gm1akwq

9gm1akwq5#

对我来说,这是重复的基调。

modelBuilder.Entity<PokemonCategory>()
            .HasKey(pc => new { pc.pokemonId, pc.categoryId });
        modelBuilder.Entity<PokemonCategory>()
            .HasOne(p => p.Pokemon)
            .WithMany(pc => pc.PokemonCategories)
            .HasForeignKey(p => p.pokemonId);
        modelBuilder.Entity<PokemonCategory>()
            .HasOne(p => p.Pokemon)       //it should be p.Category
            .WithMany(pc => pc.pokemonCategories)
            .HasForeignKey(c => c.categoryId);

相关问题