3

我希望在花费无数个小时配置现有数据库的数据模型之后,有人会为我提供更多见解。我有以下数据库结构实体框架4.3一对一外键关系

User (Table) 
    UserID (P.K Identity int) 
    UserName (nvarchar) 

UserSetting (Table) 
    UserSettingsID (P.K Identity int) 
    UserSettingsUserID (F.K of User.UserID) 

在该模型中,我有一个属性UserSetting用户实体和用户属性在usersetting实体。

在用户设置实体类型配置中;

this.HasRequired(t => t.User) 
    .WithMany(t => t.UserSetting) 
    .HasForeignKey(d => d.UserSettingsUserID) 
    .WillCascadeOnDelete(false); 

如果我在用户实体中将UserSetting设置为ICollection,以上操作将仅适用(这是我目前唯一的解决方案)。我曾尝试设置外键属性和几乎所有我能在网上找到的东西,但没有运气。这是我第一次使用存储库模式和工作单元编码实体框架。

+0

要在您的架构定义中强制DB中的1对1关系,您需要在UserSetting表中的UserSettingUserID列上有一个唯一约束。如果我没有弄错,EF 5.0中只会支持唯一的约束条件:http://geekswithblogs.net/JoshReuben/archive/2010/09/13/entity-framework-5.0---not-quite-there-yet。 aspx http://blogs.msdn.com/b/efdesign/archive/2011/03/09/unique-constraints-in-the-entity-framework.aspx –

+1

@DannyVarod:EF 5.0中不支持唯一约束:http://blogs.msdn.com/b/adonet/archive/2012/05/15/ef5-release-candidate-available-on-nuget.aspx去年它在路线图上,但没有做到进入EF 5。 – Slauma

回答

2

检查这个人的博客的解决方案:

http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

基本上是:

modelBuilder.Entity<User>(). 
HasRequired(us => us.UserSetting). 
WithMany(). 
HasForeignKey(u => u.UserSettingId); 

密切注意他是如何构造的User类的属性和属性的名称。名称必须相应匹配。顺便说一句:用数据注释装饰实体比使用Fluent API容易得多。

0

如果您正在寻找一对一那么UserSetting表应该有一个主键,这个键应该是外键的用户表在同一时间:

用户(表)的用户ID(身份PK INT)用户名(为nvarchar) UserSetting(表)UserSettingsID(PK身份User.UserID的INT和FK)

2

您可以使用此模式在EF 4.x的1至0..1实体映射:

Table Users 
    UserID int, PK, Identity 
    UserName nvarchar 

Table UserSettings 
    UserID int, PK, non-Identity, FK to Users 
    Settings nvarchar(max) or any other type 

或者该模式为EF 4.x的1对1的实体映射(表分成两个实体):

Table Users 
    UserID int, PK, Identity 
    UserName nvarchar 
    Settings nvarchar(max) or any other type 

链接表拆分:
Using DB-First
Using Code-First