Entity framework 4 如何定义类型之间的多对一关系,该关系不';不存在于数据库中

Entity framework 4 如何定义类型之间的多对一关系,该关系不';不存在于数据库中,entity-framework-4,Entity Framework 4,有人能给我一些指示吗? 首先,我创建了Order和OrderItem表之间的多对一关系,以及Product和OrderItem之间的多对一关系,然后在使用EF code First Powertool生成代码后,我删除了这些表之间的关系。我希望EF类型而不是数据库能够保持关系并检查数据的一致性。有人说,独立关联可以创建数据库中不存在的关系。但是我做不到。这是我的代码,请检查一下。谢谢 公共类秩序 { 公共秩序() { this.OrderItems=新列表(); } public System.

有人能给我一些指示吗? 首先,我创建了Order和OrderItem表之间的多对一关系,以及Product和OrderItem之间的多对一关系,然后在使用EF code First Powertool生成代码后,我删除了这些表之间的关系。我希望EF类型而不是数据库能够保持关系并检查数据的一致性。有人说,独立关联可以创建数据库中不存在的关系。但是我做不到。这是我的代码,请检查一下。谢谢

公共类秩序
{
公共秩序()
{
this.OrderItems=新列表();
}
public System.Guid Id{get;set;}
public System.DateTime CreatedTime{get;set;}
公共虚拟ICollection OrderItems{get;set;}
}
公共类OrderItem
{
public System.Guid Id{get;set;}
公共可为空的OrderId{get;set;}
公共可为空的ProductId{get;set;}
公共可空CreatedTime{get;set;}
公共虚拟订单{get;set;}
公共虚拟产品产品{get;set;}
}
公共类产品
{
公共产品()
{
this.OrderItems=新列表();
}
public System.Guid Id{get;set;}
公共字符串名称{get;set;}
公共虚拟ICollection OrderItems{get;set;}
}
公共类OrderItemMap:EntityTypeConfiguration
{
public OrderItemMap()
{
//主键
this.HasKey(t=>t.Id);
//性质
//表和列映射
本表为ToTable(“订单项”);
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”);
//关系
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);
}
}
公共类OrderMap:EntityTypeConfiguration
{
公共秩序地图()
{
//主键
this.HasKey(t=>t.Id);
//性质
//表和列映射
本表为可转让的(“订单”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.Property(t=>t.CreatedTime).HasColumnName(“CreatedTime”);
}
}
公共类ProductMap:EntityTypeConfiguration
{
公共产品地图()
{
//主键
this.HasKey(t=>t.Id);
//性质
this.Property(t=>t.Name)
.IsFixedLength()
.HasMaxLength(100);
//表和列映射
本表为可转帐(“产品”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.Property(t=>t.Name).HasColumnName(“Name”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
使用(var context=new ProductsContext())
{
Guid gProductId=Guid.NewGuid();
Guid gOrderId=Guid.NewGuid();
产品=新产品
{
Id=gProductId,
Name=“Prodcut1”,
};
订单=新订单()
{
Id=gOrderId,
CreatedTime=DateTime.Now
};
Guid gItem1Id=Guid.NewGuid();
OrderItem1=新的OrderItem()
{
Id=gItem1Id,
订单=订单,
产品=产品,
CreatedTime=DateTime.Now
};
context.Orders.Add(订单);
context.Products.Add(产品);
context.OrderItems.Add(item1);
context.SaveChanges();//这个有效
}
Console.WriteLine(“现在创建…”);
Console.ReadLine();
使用(var c=new ProductsContext())
{
Guid gItem2Id=Guid.NewGuid();
OrderItem2=新的OrderItem()
{
Id=gItem2Id,
OrderId=Guid.NewGuid(),//不存在订单,
CreatedTime=DateTime.Now
};
c、 OrderItems.Add(item2);
c、 保存更改();
}
}
}

我预计最后一次
SaveChanges
会抛出一个异常,说“订单不存在,无法插入此记录”。但事实并非如此。此记录已成功创建。

实体框架未强制执行完全引用完整性。它只强制执行一些基本场景-例如,如果子实体存在,它将不允许删除父实体,但仅当父实体和子实体都加载到您的上下文中时才允许删除。完全引用完整性由数据库(或您自己的自定义逻辑)负责。

实体框架不强制执行完全引用完整性。它只强制执行一些基本场景-例如,如果子实体存在,它将不允许删除父实体,但仅当父实体和子实体都加载到您的上下文中时才允许删除。完全引用完整性是数据库(或您自己的自定义逻辑)的责任。

您删除了什么关系以及为什么?我已更新了它,请再次查看。谢谢。NHibernate也不会这样做。这需要在每次插入时选择
(在您的示例中为Order.Id)。我不想要这样一个ORM。你听起来有点困惑。是的,可以在EF中对数据库中不受FK约束支持的关联进行建模,但这些关联不强制引用完整性。此外,这并不涉及诚信。基本上,当插入不存在的Id且不存在FK约束时,数据库的完整性不会受到侵犯。谢谢,我明白了,您对Ladislav Mrmka有相同的看法。因此,我们最好使模型关联与