Can anyone give some instructions?
Firstly, I created many-to-one relationship between Order and OrderItem tables, and many-to-one relationship between Product and OrderItem, then I just deleted relationship between these tables after generating the code with EF Code First Powertool. I expected EF types instead of database can keep the relationship and check the Data consistency . Someone said independent association can create relationships that don’t exist in the database. But I can not make it. here is my code , please review it . thanks
public class Order
{
public Order()
{
this.OrderItems = new List<OrderItem>();
}
public System.Guid Id { get; set; }
public System.DateTime CreatedTime { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItem
{
public System.Guid Id { get; set; }
public Nullable<System.Guid> OrderId { get; set; }
public Nullable<System.Guid> ProductId { get; set; }
public Nullable<System.DateTime> CreatedTime { get; set; }
public virtual Order Order { get; set; }
public virtual Product Product { get; set; }
}
public class Product
{
public Product()
{
this.OrderItems = new List<OrderItem>();
}
public System.Guid Id { get; set; }
public string Name { get; set; }
public virtual ICollection<OrderItem> OrderItems { get; set; }
}
public class OrderItemMap : EntityTypeConfiguration<OrderItem>
{
public OrderItemMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
// Table & Column Mappings
this.ToTable("OrderItem");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.OrderId).HasColumnName("OrderId");
this.Property(t => t.ProductId).HasColumnName("ProductId");
this.Property(t => t.CreatedTime).HasColumnName("CreatedTime");
// Relationships
this.HasRequired(t => t.Order)
.WithMany(t => t.OrderItems)
.HasForeignKey(d => d.OrderId);
this.HasRequired(t => t.Product)
.WithMany(t => t.OrderItems)
.HasForeignKey(d => d.ProductId);
}
}
public class OrderMap : EntityTypeConfiguration<Order>
{
public OrderMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
// Table & Column Mappings
this.ToTable("Order");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.CreatedTime).HasColumnName("CreatedTime");
}
}
public class ProductMap : EntityTypeConfiguration<Product>
{
public ProductMap()
{
// Primary Key
this.HasKey(t => t.Id);
// Properties
this.Property(t => t.Name)
.IsFixedLength()
.HasMaxLength(100);
// Table & Column Mappings
this.ToTable("Product");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Name).HasColumnName("Name");
}
}
class Program
{
static void Main(string[] args)
{
using (var context = new ProductsContext())
{
Guid gProductId = Guid.NewGuid();
Guid gOrderId = Guid.NewGuid();
Product product = new Product
{
Id = gProductId,
Name = "Prodcut1",
};
Order order = new Order()
{
Id = gOrderId,
CreatedTime = DateTime.Now
};
Guid gItem1Id = Guid.NewGuid();
OrderItem item1 = new OrderItem()
{
Id = gItem1Id,
Order=order,
Product=product,
CreatedTime = DateTime.Now
};
context.Orders.Add(order);
context.Products.Add(product);
context.OrderItems.Add(item1);
context.SaveChanges();//this one works
}
Console.WriteLine("Created now...");
Console.ReadLine();
using (var c = new ProductsContext())
{
Guid gItem2Id = Guid.NewGuid();
OrderItem item2 = new OrderItem()
{
Id = gItem2Id,
OrderId = Guid.NewGuid(),//doesn't exist order ,
CreatedTime = DateTime.Now
};
c.OrderItems.Add(item2);
c.SaveChanges();
}
}
}
I expected the last SaveChanges would throw an exception saying “order doesn’t exist, can not insert this record”. But it doesn’t. This record was created successfully.
Entity framework doesn’t enforce full referential integrity. It enforces only some basic scenarios – for example it will not allow you to delete parent entity if child entity exists but only if both parent and child are loaded in your context. The full referential integrity is responsibility of the database (or your own custom logic).