ठीक है, तो आप बस कुछ गलत कर रहे हैं। मेरी टिप्पणी के अलावा, मैंने आपके लिए एक नमूना बनाया है जो दिखाता है कि ईएफ डिफ़ॉल्ट रूप से डुप्लिकेट नहीं बनाता है।
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public ProductCategory Category { get; set; }
public decimal Price { get; set; }
}
public class ProductCategory
{
public int Id { get; set; }
public string Name { get; set; }
}
एक संदर्भ:
public class MyContext : DbContext
{
public DbSet<Product> Products { get; set; }
public DbSet<ProductCategory> ProductCategories { get; set; }
public MyContext()
: base("name=MyContext")
{
}
public MyContext(string nameOrConnectionString)
: base(nameOrConnectionString)
{
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<MyContext>(null);
// Table mappings
modelBuilder.Entity<Product>().ToTable("Product");
modelBuilder.Entity<ProductCategory>().ToTable("ProductCategory");
base.OnModelCreating(modelBuilder);
}
}
फिर एक प्रारंभकर्ता वर्ग (इस अन्य रणनीतियों से विरासत सकता है अगर आप चाहते हैं):
public class InitDb<TContext> : DropCreateDatabaseAlways<TContext>
where TContext : DbContext
{
}
मैं दो वर्गों है मुख्य कार्यक्रम:
static void Main(string[] args)
{
var prodCat = new ProductCategory()
{
Name = "Category 1"
};
var prod = new Product()
{
Name = "Product 1",
Category = prodCat,
Price = 19.95M
};
using (var context = new MyContext())
{
var initializer = new InitDb<MyContext>();
initializer.InitializeDatabase(context);
Console.WriteLine("Adding products and categories to context.");
context.ProductCategories.Add(prodCat);
context.Products.Add(prod);
Console.WriteLine();
Console.WriteLine("Saving initial context.");
context.SaveChanges();
Console.WriteLine("Context saved.");
Console.WriteLine();
Console.WriteLine("Changing product details.");
var initProd = context.Products.Include(x => x.Category).SingleOrDefault(x => x.Id == 1);
PrintProduct(initProd);
initProd.Name = "Product 1 modified";
initProd.Price = 29.95M;
initProd.Category.Name = "Category 1 modified";
PrintProduct(initProd);
Console.WriteLine();
Console.WriteLine("Saving modified context.");
context.SaveChanges();
Console.WriteLine("Context saved.");
Console.WriteLine();
Console.WriteLine("Getting modified product from database.");
var modProd = context.Products.Include(x => x.Category).SingleOrDefault(x => x.Id == 1);
PrintProduct(modProd);
Console.WriteLine();
Console.WriteLine("Finished!");
Console.ReadKey();
}
}
static void PrintProduct(Product prod)
{
Console.WriteLine(new string('-', 10));
Console.WriteLine("Id : {0}", prod.Id);
Console.WriteLine("Name : {0}", prod.Name);
Console.WriteLine("Price : {0}", prod.Price);
Console.WriteLine("CatId : {0}", prod.Category.Id);
Console.WriteLine("CatName : {0}", prod.Category.Name);
Console.WriteLine(new string('-', 10));
}
यह निम्न सांत्वना उत्पादन में परिणाम है:
Adding products and categories to context.
Saving initial context.
Context saved.
Changing product details.
----------
Id : 1
Name : Product 1
Price : 19,95
CatId : 1
CatName : Category 1
----------
----------
Id : 1
Name : Product 1 modified
Price : 29,95
CatId : 1
CatName : Category 1 modified
----------
Saving modified context.
Context saved.
Getting modified product from database.
----------
Id : 1
Name : Product 1 modified
Price : 29,95
CatId : 1
CatName : Category 1 modified
----------
Finished!
इसके अलावा, जब SQL सर्वर प्रबंधन स्टूडियो में देख, यह समाधान केवल बनाया गया है (और अद्यतन) एक उत्पाद है और एक श्रेणी।
संभोग, आपको अपने डेटा को पुनर्प्राप्त, अपडेट और हटाने और काम की इकाई को हटाने के लिए भंडारों के साथ काम करना चाहिए। इन्हें उदाहरण से बाहर कर दिया गया है।
तो, अगर आप किसी भी कोड पोस्ट न करें, हम आपकी सहायता नहीं कर बहुत आगे :-)
क्या आप वह कोड जोड़ सकते हैं जिसमें आप डेटा बनाते हैं? यदि आपकी कक्षाओं में आपके संदर्भ सही हैं, तो ईएफ को केवल एक बार सभी उदाहरण बनाना चाहिए। – Nullius
हां यह एक ही समय में सभी उदाहरण बनाता है। वास्तव में यह समस्या है। मुझे फिर से समस्या की व्याख्या करने दो। मान लें कि मेरे पास उत्पाद का एक उदाहरण है जिसमें इसके अंदर एक उत्पाद प्रकार उदाहरण है। मान लें कि अतीत में उत्पाद उदाहरण पहले से ही जारी है। जब मैं उस उत्पाद आवृत्ति को अद्यतन करने का प्रयास करता हूं, तो ईएफ एक डुप्लिकेट उत्पाद प्रकार उदाहरण बनाता है (जो एक ऐसा मामला है जिसे मैं नहीं चाहता) अगर मैं उत्पाद प्रकार की स्थिति को अपरिवर्तित नहीं करता हूं। – Furkan