Pertanyaan Bagaimana memetakan entitas anak ke entitas induk tanpa memperkenalkan tautan tipe orang tua primitif dalam entitas anak?


Saya memiliki kelas-kelas ini:

public class Product
{
    [Key]
    public virtual int ProductId { get; set; }
    public virtual string ProductName { get; set; }
    public virtual string Category { get; set; }

    public virtual IList<ProductPricing> ProductPriceList { get; set; }


    [Timestamp]
    public virtual byte[] Version { get; set; }
}

public class ProductPricing
{        

    // no ProductId here
    public virtual Product Product { get; set; }

    [Key]
    public virtual int ProductPricingId { get; set; }

    public virtual DateTime EffectiveDate { get; set; }
    public virtual decimal Price { get; set; }


}

Ini adalah modelBuilder saya:

modelBuilder.Entity<Product>().
    HasMany(x => x.ProductPriceList)
   .WithRequired()
   .HasForeignKey(x => x.Product);

Ini adalah kesalahannya:

Komponen kunci asing 'Produk' bukan merupakan properti yang dideklarasikan   ketik 'ProductPricing'. Verifikasi bahwa itu belum secara eksplisit dikecualikan   dari model dan bahwa itu adalah properti primitif yang valid.

MEMPERBARUI 

Saya sudah mencoba yang berikut, kesalahan yang sesuai di bawah kode

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired();

{"Nama kolom tidak valid 'Product_ProductId1'. \ R \ nNama kolom tidak valid   'Product_ProductId'. \ R \ n Nama kolom tidak valid 'Product_ProductId1'. "}

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired()
    .Map(x => x.MapKey("ProductId"));

{"Nama kolom tidak valid 'Product_ProductId'."}

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired(x => x.Product);

{"Nama kolom tidak valid 'Product_ProductId'. \ R \ nNama kolom tidak valid   'Product_ProductId'. "}

modelBuilder.Entity<Product>()
    .HasMany(x => x.ProductPriceList)
    .WithRequired(x => x.Product)
    .Map(x => x.MapKey("ProductId"));

{"Kendala Multiplisitas dilanggar. Peran   'Product_ProductPriceList_Source' dari hubungan tersebut   'TestEfCrud.Mappers.Product_ProductPriceList' memiliki multiplisitas 1 atau   0..1. "}

Jika itu bisa membantu, inilah DDL:

create table Product
(
ProductId int not null identity(1,1) primary key,
ProductName varchar(100) not null,
Category varchar(100) not null,
Version rowversion not null
);

create table ProductPricing
(
ProductId int not null references Product(ProductId),
ProductPricingId int identity(1,1) not null primary key,
EffectiveDate datetime not null,
Price decimal(18,6) not null
);

PERBARUI 2

Saya sudah mencoba jawaban ini, yang terlihat a sedikit mirip dengan kasus saya, pemetaan berasal dari entitas anak Cara memetakan kolom induk di kode EF 4.1 terlebih dahulu

Namun, menggunakan ini:

modelBuilder.Entity<ProductPricing>()
    .HasOptional(x => x.Product)
    .WithMany()
    .Map(x => x.MapKey("ForeignKeyColumn"));

dan ini:

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany()
    .HasForeignKey(x => x.Product);

Keduanya menghasilkan kesalahan ini:

{"Nama kolom tidak valid 'Product_ProductId1'. \ R \ nNama kolom tidak valid   'Product_ProductId1'. \ R \ n Nama kolom tidak valid 'Product_ProductId1'. "}


5
2017-08-03 06:53


asal


Jawaban:


Saya tidak mengerti mengapa Anda menggunakan pemetaan yang lancar? Model Anda harus dipetakan oleh konvensi default. Jika Anda ingin memetakannya dengan penggunaan pemetaan yang lancar:

modelBuilder.Entity<Product>()
            .HasMany(x => x.ProductPriceList) // Product has many ProductPricings
            .WithRequired(y => y.Product)     // ProductPricing has required Product
            .Map(m => m.MapKey("ProductId")); // Map FK in database to ProductId column

4
2017-08-03 07:58



Ini memiliki jawaban yang benar:

http://agilenet.wordpress.com/2011/04/18/entity-framework-code-first-specify-foreign-key-name-in-one-to-many-relationship-with-fluent-api/

Saya hampir mendapatkannya:

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany()
    .Map(x => x.MapKey("ProductId"));

Saya hanya lupa menempatkan dependensi principal (yaitu. ProductPriceList. Saya harap saya mendapatkan terminologi yang benar, ingin menjauh dari terminologi orang tua ^ _ ^):

modelBuilder.Entity<ProductPricing>()
    .HasRequired(x => x.Product)
    .WithMany(x => x.ProductPriceList)
    .Map(x => x.MapKey("ProductId"));

Pemetaan Lancar Entitas Framework hampir tidak fasih, ada beberapa gagap yang dapat Anda lakukan tanpa sadar jika Anda tidak terlalu akrab dengan nuansa masing-masing metode :-) Dengar itu, saya hampir mendapatkannya benar. Lewat keduanya ProductPricing dan ProductPriceList terlihat berlebihan, sangat tidak intuitif.

EF fasih pemetaan hampir tidak fasih baik (yang intuitifitas harus menjadi kualitas bawaan) antarmuka warga, bukan?


2
2017-08-03 10:56