鉴于以下POCO课程:
public class Certification {
public int Id { get; set; }
public virtual ICollection<Employee> CertifiedEmployees { get; set; }
}
public class Employee {
public int Id { get; set; }
public virtual ICollection<Certification> Certifications { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
使用EF4 CTP4代码第一种方法创建数据库模型会创建所需的联结表:
CREATE TABLE [dbo].[Certifications_CertifiedEmployees](
[Certifications_Id] [int] NOT NULL,
[CertifiedEmployees_Id] [int] NOT NULL,
...
Run Code Online (Sandbox Code Playgroud)
但是,表名和列名称并不理想,因为它们是从关联的类属性名称生成的.我宁愿:
CREATE TABLE [dbo].[Employees_Certifications](
[Employee_Id] [int] NOT NULL,
[Certification_Id] [int] NOT NULL,
...
Run Code Online (Sandbox Code Playgroud)
有谁知道在这种情况下是否可以更改生成的列名称,还可以选择更改表名,以便Employees在Certifications之前?
谢谢,加里
我刚刚有一个巨大的*金发时刻**,但它突出了我对Entity Framework的烦恼.我已经禁用了延迟加载,因此我强迫自己实际考虑我需要哪些数据以尽可能快地保持应用程序.
因此,为了在查询中返回数据,我需要使用该Include方法:
var query = from item in context.Customers
.Include(x=> x.Orders)
select item
Run Code Online (Sandbox Code Playgroud)
这是好的,直到我想在层次结构中更深入地选择一个项目.即:
Customer 1-* Orders *-1 Factory 1-1 Factory Type
Run Code Online (Sandbox Code Playgroud)
据我所知,热切返回所有这些数据的唯一方法是执行以下操作:
var query = from item in context.Customers
.Include("Orders.Factory.FactoryType")
select item
Run Code Online (Sandbox Code Playgroud)
有了上述内容,我无法System.Data.Entity按照我的第一个例子使用Lambdas.有没有人知道我在这里是否遗漏了一些明显的东西,还是我坚持使用字符串声明通过集合导航属性?
如果我没有任何收藏品,我可以写:
.Include(x=> x.Order.OrderType.Factory.FactoryType) // No bother
Run Code Online (Sandbox Code Playgroud)
但是由于Orders收集,就我所知FirstOrDefault,没有办法直接进入儿童财产(SingleOrDefault等等,不起作用).
**这只是一个转折,我碰巧非常喜欢金发*
我想弄清楚是什么
[DatabaseGenerated(DatabaseGenerationOption.Computed)]
Run Code Online (Sandbox Code Playgroud)
DataAnnotation确实如此.但是,我无法通过谷歌搜索或MSDN搜索找到任何信息.有谁有想法吗?
在我的Global.asax中,我有以下几行:
Database.SetInitializer<myDbSupport>
(new DropCreateDatabaseIfModelChanges<myDbSupport>());
Run Code Online (Sandbox Code Playgroud)
如果我没有这个,那么当我更改模型时,sdf数据库将没有正确的结构.这在开发环境中是可以的,但是当我转向生产并希望更新数据库结构时,我当然不能放弃表,并丢失数据.
是否可以编写数据库更改脚本,并在部署具有更改结构的模型之前运行此更新?
是否可以仅使用数据注释在Entity Framework 4.1(Code First方法)中定义多对多关系,而无需使用模型构建器?
例如,类似于:
Product = { Id, Name, ... }
Category = { Id, Name, ... }
ProductCategory = { ProductId, CategoryId }
Run Code Online (Sandbox Code Playgroud)
你得到了照片.
我不希望ProductCategory在上下文中有两个多对一的中间实体,因为我没有任何额外的数据,只有两个FK.此外,我应该能够为中间表定义表名,以便与现有数据库一起使用.
entity-framework code-first data-annotations ef-code-first entity-framework-4.1
我正在尝试在实体框架内首先学习代码,并且在建立关系时遇到问题.这是一个基本的人力资源数据库,为此有两个实体,员工和部门.
员工属于一个部门,该部门有一个团队管理员和一个经理,他们都是员工.我尝试使用以下方法对此进行建模:
EMPLOYEE
public int? DepartmentID { get; set; }
public virtual Department Department { get; set; }
Context:
modelBuilder.Entity<Employee>().HasOptional(x => x.Department);
DEPARTMENT
public class Department
{
[Required]
public int DepartmentID { get; set; }
[Required(ErrorMessage = "The description is required.")]
public string Description { get; set; }
public int? ManagerID { get; set; }
public virtual Employee Manager { get; set; }
public int? TeamAdministratorID { get; set; }
public virtual Employee TeamAdministrator { get; set; }
}
Context: …Run Code Online (Sandbox Code Playgroud) 我在项目中使用代码优先EF,并在插入带有自定义ID的数据时遇到问题.
当我尝试使用自定义ID(例如999)插入数据时,EF忽略它并将增加的ID插入表中.
我的模特:
public class Address
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
如何解决这个问题?
编辑:
1)如何从N开始递增,而不是从0开始递增?
2)如果我没有指定自定义ID,DB必须递增并插入自己的ID.如果我指定自定义ID,则DB必须插入它.可能吗?
我创建了一个实体类型,它具有多个引用相同类型项的集合属性.换句话说,它反映了单个数据库表,其中行被任意分组,使得行可以出现在多个组中.
在下面的简化示例中,Person类有Brothers和Sisters集合属性也引用Person实体:
public class Person
{
public Person()
{
Brothers = new Collection<Person>();
Sisters = new Collection<Person>();
}
[Key]
public string Name { get; set; }
public int Age { get; set; }
public virtual ICollection<Person> Brothers { get; set; }
public virtual ICollection<Person> Sisters { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实体框架似乎认为这是一个有效的模型,但是将其解释为创建单个PersonPersons连接表,这无法反映兄弟姐妹关系的分离.
我假设解决方案是使用流畅的API为两个关系显式映射单独的连接表,但是,尽管经过了大量的实验,我仍然无法使其工作.
有什么建议吗?
蒂姆,谢谢
是否有Visual Studio的GUI或插件来管理实体框架代码优先迁移?例如,一个有用的功能是您可以从列表中选择迁移并使用它作为TargetMigration执行Update-Database.
(我正在考虑编写这样的工具,但不确定如何与Nuget Package Manager控制台进行通信,其中插入了命令.)
我们一直在使用EF 4.0,使用.edmx模型的数据库优先方法.
我们现在升级到EF 6.1.3,我们正在调查是否使用该.edmx模型.我们仍然希望控制我们的数据库模式 - 因此我们将使用SQL脚本创建新表等,然后.edmx从现有数据库生成EF模型(或者只是代码类).
在我使用Visual Studio 2013进行试验期间,我注意到当EF 6从现有数据库创建类时,这是一个烦人的问题.我有一个Customer课程,连接Contact三个班级 - 一次为第DesignContact一次,SalesContact第三次为SupportContact.它们存储DesignContactId (INT)在Customer表格中的等列中.
您可以使用此T-SQL创建这些类:
CREATE TABLE dbo.Contact
(
ContactID INT NOT NULL
CONSTRAINT PK_Contact PRIMARY KEY CLUSTERED,
Name VARCHAR(200),
Address VARCHAR(200),
ZipCode VARCHAR(20),
City VARCHAR(100),
Phone VARCHAR(100)
)
CREATE TABLE dbo.Customer
(
CustomerID INT NOT NULL
CONSTRAINT PK_Customer PRIMARY KEY CLUSTERED,
Name VARCHAR(200),
-- other properties
DesignContactID INT
CONSTRAINT FK_Customer_DesignContact …Run Code Online (Sandbox Code Playgroud) c# sql-server code-first entity-framework-6 visual-studio-2013
code-first ×10
c# ×5
many-to-many ×2
.net-4.0 ×1
asp.net ×1
c#-4.0 ×1
database ×1
sql-server ×1