我应该如何使用Code First定义关系但不使用任何导航属性?
以前我通过在关系的两端使用导航属性来定义One-Many和Many-Many.并在数据库中创建适当的关系.这里是类的外观的简化版本(为了简单起见,我将Many-Many关系转换为one-many).
public class User
{
public string UserId { get; set; }
public string PasswordHash { get; set; }
public bool IsDisabled { get; set; }
public DateTime AccessExpiryDate { get; set; }
public bool MustChangePassword { get; set; }
public virtual Role Role { get; set; }
}
public class Role
{
public int RoleId { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public virtual ICollection<User> Users …Run Code Online (Sandbox Code Playgroud) c# entity-framework code-first entity-framework-4 ef-code-first
我在Global.asax中使用以下代码:
DbDatabase.SetInitializer<MyDBContext>
(new DropCreateDatabaseIfModelChanges<MyDBContext>());
Run Code Online (Sandbox Code Playgroud)
但它似乎没有用.
虽然我的模型已经改变,我试图使用其中一个新添加的表,但它只是说找不到表.
Invalid object name 'dbo.TableName'.
Run Code Online (Sandbox Code Playgroud)
但是,如果我运行它,它似乎工作,并且正在创建表:
DbDatabase.SetInitializer<MyDBContext>(new DropCreateDatabaseAlways<MyDBContext>());
Run Code Online (Sandbox Code Playgroud)
它确实更新了我的数据库.
我做错了什么?
如果我有以下班级模型......
public class A
{
public int AId { get; set; }
public ICollection<B> BCollection { get; set; }
}
public class B
{
public int BId { get; set; }
public ICollection<C> CCollection { get; set; }
}
public class C
{
public int CId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...是否可以A从包含所有级联集合的数据库中急切加载类型的对象?
我可以这样包括BCollection:
A a = context.ASet.Where(x => x.AId == 1)
.Include(x => x.BCollection)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
我是否还可以以某种方式CCollection包含所有已加载的B对象,以便A使用单个数据库查询来获取内存中的所有依赖对象?
我使用Code First范例编写了一个ASP.Net MVC 3应用程序,当我对模型进行更改时,Entity Framework会自动尝试通过DROP和CREATE语句重新创建基础SQL Server数据库.问题是应用程序托管在第三方远程服务器上,这限制了我可以拥有的数据库的数量,并且似乎不允许我以编程方式执行"CREATE DATABASE ..."语句,因为我收集此错误消息:
数据库"master"中的CREATE DATABASE权限被拒绝.
有没有办法阻止实体框架删除并尝试重新创建整个数据库,而是让它简单地删除表并重新创建它们?
在手动创建数据库并运行应用程序后,我也会收到以下错误,因为实体框架尝试修改数据库:
无法检查模型兼容性,因为数据库不包含模型元数据.确保已将IncludeMetadataConvention添加到DbModelBuilder约定中.
我有类似的课程:
Person
{
Name
Address
}
Employee : Person
{
Compensation - object
}
Visitor : Person
{
}
Run Code Online (Sandbox Code Playgroud)
如果我写linq:
var persons = Context.Persons
.Include("Compensation");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
指定的包含路径无效.EntityType"Person"未声明名为"Compensation"的导航属性.
如果我这样做,它可以正常工作
var persons = Context.Persons
.OfType<Employee>()
.Include("Compensation");
Run Code Online (Sandbox Code Playgroud)
但我想让员工和访问者在同一个查询中.
看起来在EF4 UserVoice上有此功能的请求:http: //data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1249289-include-property-of衍生类?REF =标题
但它看起来不会很快就会完成.
这个问题有什么好的解决方法?
我跟随两个实体,我试图使用外键关联(一对一).
public class StandardRack {
public int Id {get;set}
public StandardRelay StandardRelay {get;set}
}
public class StandardRelay {
public int Id {get;set}
public int StandardRack_Id {get;set;}
[Required][ForeignKey("StandardRack_Id")]
public StandardRack StandardRack { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这会抛出ModelValidationException.任何想法为什么这样一个看似简单的一对一双向关系无法配置.
编辑:
这是例外:
捕获到System.Data.Entity.ModelConfiguration.ModelValidationException消息=在模型生成期间检测到一个或多个验证错误:
System.Data.Edm.EdmAssociationEnd :: Multiplicity在关系'StandardRelay_StandardRack'中的角色'StandardRelay_StandardRack_Source'中无效.由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为*.
Source = EntityFramework StackTrace:位于System.Data.Entity的System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateCsdl(EdmModel model)的System.Data.Entity.ModelConfiguration.Edm.EdmModelExtensions.ValidateAndSerializeCsdl(EdmModel model,XmlWriter writer) .DbModelBuilder.Build(DbProviderManifest providerManifest,DbProviderInfo providerInfo)在System.Data.Entity.DbModelBuilder.Build(的DbConnection providerConnection)在System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)在System.Data.Entity.Internal. RetryLazy
2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.InternalSet1.Initialize()在System.Linq.Enumerable.ToList的System.Data.Entity.Internal.Linq.InternalSet1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()at System.Collections.Generic.List1..ctor(IEnumerable1 collection) [TSource](IEnumerable`1 source)位于D:\ RailwayProjects\RelayAnalysis\TestApplication\MainWindow.xaml.cs中的TestApplication.MainWindow.Window_Loaded(Object …
在声明导航属性时,为什么我们需要使用"virtual"关键字?我知道Code First框架以某种方式使用它来识别属性是导航属性,但我想知道如何.具体来说,我想知道它与MSDN文档中关于"虚拟"关键字的描述有何关联:http://msdn.microsoft.com/en-us/library/9fkccyh4(v = vs.80)的.aspx
在我的项目中尝试实施EF迁移时,我被困在一个地方.
EF Code First MigrateDatabaseToLatestVersion接受来自config的连接字符串Name.
在我的情况下,数据库名称在运行时得知(用户从下拉列表中选择它).就像DbContext在其构造函数中接受,ConnectionString或connectionString Name的方式,"MigrateDatabaseToLatestVersion"不接受相同的
Run Code Online (Sandbox Code Playgroud)System.Data.Entity.Database.SetInitializer (new MigrateDatabaseToLatestVersion<SrcDbContext, SRC.DomainModel.ORMapping.Migrations.Configuration>(connString));
有没有其他方法来实现这一目标?
我有一个SQL视图:
WITH DirectReports (ID,ParentFolderID, ParentFolderName,FolderID,FolderName,OwnerOCID,OwnerArName,OwnerEnName,FolderType,LEVEL)
AS
(
SELECT e.Id AS ID,cast(cast(0 AS binary) AS uniqueidentifier) AS ParentFolderID, cast('MainFolder - ' + MainFolders.enName AS nvarchar(250)) AS ParentFolderName,
e.Id AS FolderID, e.Name AS FolderName, WorkSpaces.Owner_Id AS OwnerOCID, OrgCharts.arName AS OwnerArName, OrgCharts.enName AS OwnerEnName,
MainFolders.Type AS FolderType, 0 AS LEVEL
FROM WorkSpaceFolders AS e INNER JOIN
MainFolders ON MainFolders.RootFolder_Id = e.Id INNER JOIN
WorkSpaces ON WorkSpaces.Id = MainFolders.WorkSpace_Id INNER JOIN
OrgCharts ON OrgCharts.Id = WorkSpaces.Owner_Id
WHERE e.Root = 1 AND e.Parent_Id IS NULL …Run Code Online (Sandbox Code Playgroud) 我目前正在开发MVC 3中的项目.我已将我的问题分开,因此有一些项目,如Core,Repository,UI,Services等.我实现了Repository,UnitOfWork,最重要的是State模式.
我正在使用Entity Framework 4.3来保存我的数据,并且我遇到了一个涉及当前状态持久性的相当烦人的情况.以下是一些类示例:
public class Request
{
public int RequestId { get; set; }
public State CurrentState { get; set; }
}
public abstract class State
{
[Key]
public string Name {get; set;}
public virtual void OpenRequest(Request request)
{}
public virtual void CloseRequest(Request request)
{}
}
public class RequestIsOpenState : State
{
public RequestIsOpenState()
{
this.Name = "Open";
}
public override void CloseRequest(Request request)
{
request.CurrentState = new RequstIsClosedState();
}
}
public class RequestIsClosedState : State
{
public …Run Code Online (Sandbox Code Playgroud)