1

私はEF 4.1コードを使用しています。ここでEFは私が設定したプロパティをオーバーライドしています

public class Vendor 
{ 
    public int VendorId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<VendorProduct> VendorProducts { get; set; } 
} 
public class VendorProduct 
{ 
    public int VendorProductId { get; set; } 
    public int ProductId { get; set; } 
    public int VendorId { get; set; } 
    public string VendorProductNumber { get; set; } 
    public int Quantity { get; set; } 
    public decimal SalesPrice { get; set; } 
    public Product Product { get; set; } 
    public Vendor Vendor { get; set; } 
} 
public class Product 
{ 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
    public string Manufacturer { get; set; } 
    public string ManufacturerNumber { get; set; } 
    public string UPC { get; set; } 
    public decimal SalesPrice { get; set; } 
    public string Description { get; set; } 
    public virtual ICollection<VendorProduct> VendorProducts { get; set; } 
} 

は、ここで構成

public class VendorConfiguration : EntityTypeConfiguration<Vendor> 
{ 
    public VendorConfiguration() 
    { 
     Property(p => p.Name).IsOptional().HasMaxLength(128); 
    } 
} 
public class ProductConfiguration : EntityTypeConfiguration<Product> 
{ 
    public ProductConfiguration() 
    { 
     //HasKey(p => p.ProductId); 
     //HasMany(p => p.Images).WithOptional(); 
     Property(p => p.Name).IsOptional().HasMaxLength(128); 
     Property(p => p.Manufacturer).IsOptional().HasMaxLength(64); 
     Property(p => p.ManufacturerNumber).IsOptional().HasMaxLength(32); 
     Property(p => p.UPC).IsOptional().HasMaxLength(32); 
     Property(p => p.SalesPrice).IsOptional(); 
    } 
} 
    public VendorProductConfiguration() 
    { 
     //HasKey(v => v.VendorProductId); 
     Property(o => o.Quantity).IsRequired(); 
     Property(o => o.SalesPrice).IsRequired(); 
     Property(o => o.VendorId).IsRequired(); 
     Property(o => o.ProductId).IsRequired(); 
     Property(o => o.VendorProductNumber).IsOptional().HasMaxLength(50); 
     HasRequired(o => o.Product).WithMany(p => p.VendorProducts).HasForeignKey(o => o.ProductId).WillCascadeOnDelete(false); 
    } 

あるDbContextです。

public class UbidContext : DbContext 
{ 
    public IDbSet<Product> Products { get; set; } 
    public IDbSet<Vendor> Vendors { get; set; } 
    public IDbSet<VendorProduct> VendorProducts { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // Add any configuration or mapping stuff here 
     modelBuilder.Configurations.Add(new VendorConfiguration()); 
     modelBuilder.Configurations.Add(new VendorProductConfiguration()); 
     modelBuilder.Configurations.Add(new ProductConfiguration()); 
    } 


    public void Seed(UbidContext context) 
    { 
     //Create our indexes 
     context.Database.ExecuteSqlCommand("CREATE INDEX IX_Products_Name ON Products (Name)"); 
     context.Database.ExecuteSqlCommand("CREATE INDEX IX_Products_Manufacturer ON Products (Manufacturer)"); 
     context.Database.ExecuteSqlCommand("CREATE INDEX IX_Products_ManufacturerNumber ON Products (ManufacturerNumber)"); 
     context.Database.ExecuteSqlCommand("CREATE INDEX IX_Products_UPC ON Products (UPC)"); 

     //Add vendors to the database 
     AddVendors(context); 
     context.SaveChanges(); 

     //Add products to the database 
     AddProducts(context); 
     context.SaveChanges(); 

     //Add vendor products to the database 
     AddVendorProducts(context); 
    } 

    private static void AddVendors(UbidContext context) 
    { 
     new List<Vendor> 
      { 
       new Vendor() 
        { 
         Name = "TestVendor1", 
        }, 
       new Vendor() 
        { 
         Name = "TestVendor2", 
        }, 
       new Vendor() 
        { 
         Name = "TestVendor3", 
        } 
      }.ForEach(v => context.Vendors.Add(v)); 
    } 

    private static void AddProducts(UbidContext context) 
    { 
     Image[] images = new Image[1]; 
     images[0] = new Image 
     { 
      Url = "http://content.etilize.com/Thumbnail/10006997.jpg" 
     }; 

     new List<Product> 
      { 
       new Product() 
        { 
         Manufacturer = "StarTech.com", 
         ManufacturerNumber = "SV211K", 
         Name = "StarTech.com SV211K KVM Switch - 2 x 1 - 2 x HD-15 Video", 
         UPC = "SV211K", 
         Images = images 
        }, 
       new Product() 
        { 
         Manufacturer = "Targus Group International", 
         ManufacturerNumber = "CBT300", 
         Name = "Targus BlackTop Standard Notebook Case - Clamshell - Carrying Strap - 5 Pocket - Nylon - Black, Blue", 
         UPC = "CBT300" 
        }, 
       new Product() 
        { 
         Manufacturer = "Lenovo Group Limited", 
         ManufacturerNumber = "31P8700", 
         Name = "Lenovo Optical ScrollPoint Pro Mouse - Optical - USB, PS/2", 
         UPC = "31P8700" 
        }, 
       new Product() 
        { 
         Manufacturer = "Epson Corporation", 
         ManufacturerNumber = "C823071", 
         Name = "Epson Serial Interface Board with 32K Buffer - 1 x RS-232 Serial", 
         UPC = "C823071" 
        }, 
       new Product() 
        { 
         Manufacturer = "Cisco Systems, Inc", 
         ManufacturerNumber = "WSX4013", 
         Name = "Cisco Catalyst 4000 Series Supervisor Engine II-Plus - 2 x GBIC, 1 x - Supervisor Engine", 
         UPC = "WSX4013" 
        } 
      }.ForEach(p => context.Products.Add(p)); 
    } 

    private static void AddVendorProducts(UbidContext context) 
    { 
     Random random = new Random(); 

     var vps = new List<VendorProduct>() 
      { 
       new VendorProduct() 
        { 
         ProductId = 1, 
         VendorId = 1, 
         Quantity = random.Next(3, 40), 
         SalesPrice = Converter.ConvertObjToDecimal(random.Next(20, 400)), 
        }, 
       new VendorProduct() 
        { 
         ProductId = 2, 
         VendorId = 1, 
         Quantity = random.Next(3, 40), 
         SalesPrice = Converter.ConvertObjToDecimal(random.Next(20, 400)), 
        }, 
       new VendorProduct() 
        { 
         ProductId = 3, 
         VendorId = 1, 
         Quantity = random.Next(3, 40), 
         SalesPrice = Converter.ConvertObjToDecimal(random.Next(20, 400)), 
        }, 
       new VendorProduct() 
        { 
         ProductId = 4, 
         VendorId = 2, 
         Quantity = random.Next(3, 40), 
         SalesPrice = Converter.ConvertObjToDecimal(random.Next(20, 400)), 
        }, 
       new VendorProduct() 
        { 
         ProductId = 4, 
         VendorId = 3, 
         Quantity = random.Next(3, 40), 
         SalesPrice = Converter.ConvertObjToDecimal(random.Next(20, 400)), 
        } 
      }; 
     foreach (var vp in vps) 
      context.VendorProducts.Add(vp); 
    } 

    public class DropCreateIfChangeInitializer : DropCreateDatabaseIfModelChanges<UbidContext> 
    { 
     protected override void Seed(UbidContext context) 
     { 
      context.Seed(context); 

      base.Seed(context); 
     } 
    } 

    static UbidContext() 
    { 
     Database.SetInitializer<UbidContext>(new DropCreateIfChangeInitializer()); 
    } 
} 

さて、何が起こるかは、それはVendorProductsになったとき、最初の1がうまく追加されていることですが、EFは、ベンダーオブジェクト、パターンを設定されていないように見えるため、2番目の1が保存されません私は、vendoridやproductidが同じコンテキスト内の以前のエンティティで使用された場合に追加される各vendorproductに対して、ベンダーや製品にデータを設定しないためnullに設定することを確認します。私のコードからわかるように、私は以下のVendorIdを明示的に設定していますが、EFがデータをdbに送信すると、VendorIdはnullです。詳細が必要な場合はお知らせください。

おかげ

+0

質問:1)「最初のものはうまく追加されますが、2番目のものは保存されません」とはどういう意味ですか? 'SaveChanges'はトランザクションであり、何も保存されていないか、すべてです。あなたは 'SaveChanges'で例外を取得するのですか、またはDBの最初のものだけで、他のものはありませんか? 2) "*しかし、EFがデータをdbに送るとき、VendorIdはnullです" *: "VendorId"は 'int'で、' null 'にすることはできません - 正確にはどういう意味ですか? – Slauma

答えて

0

私は、EF 4.1でコンソールアプリケーションにコードをコピーして貼り付けています。私はデータベース(SQL Server 2008 R2のエクスプレス)で、この結果を得るためにそれを実行すると:

EFSeedTest

私は(コンパイルされませんでした画像やConverter.ConvertObjToDecimalを持つものを削除して、私が直接使用していますrandom.Next)。

これはコードから期待されるものです。別の結果が出ますか?

+0

返信してコードをテストしていただきありがとうございます。私は2行目にlocalyを実行しましたが、ProductId 2を取得しました:3行目のVendorId NULL、ProductId 3を取得しました:VendorId NULL、4行目、5行目、 NULL:VendorId 3 – no1ross

+0

Seed関数で追加のcontext.SaveChangesを削除して修正しました。 – no1ross

+0

@ no1ross:しかし、データベース内の 'ProductId'や' VendorId'が 'NULL'であることは不可能です。彼らはあなたの質問に表示されているコードを持つDBの** ** null不可能な列**です。あなたが実際にDBに 'NULL'を取得した場合、あなたが実際に使用しているコードとあなたが質問で提供したコードには重要な違いがあるはずです。 – Slauma

関連する問題