zoukankan      html  css  js  c++  java
  • Entity Framework

      代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关系的映射!

    一对一关系的映射:

    用户账户密码信息表:包含用户名 密码 邮箱等账户登录时的信息

    public class SystemAccount
        {
            public SystemAccount()
            {
                Id = DateUtils.GeneratedNewGuid();
            }
            public Guid Id { get; set; }
            public string Salt { get; set; }
            public string UserName { get; set; }
            public string Password { get; set; }
            public string Tele { get; set; }
            public Guid UserId { get; set; }
            public virtual User User { get; set; }
            public virtual User CreateUser(string nick)
            {
                var user = new User();
                user.Nick = nick;
                return user;
                
            }
        }
    

      用户信息表:包含用户真实姓名,经纬度,昵称,性别等会员信息

         

    public class User
        {
            public User()
            {
                Id = DateUtils.GeneratedNewGuid();
            }
            public Guid Id { get; set; }
            public string Nick { get; set; }
            public int Gender { get; set; }
            public Guid AccountId { get; set; }
            public virtual SystemAccount Account { get; set; }
        }
    

      然后fluent api关系配置如下

     public class SystemAccountMapping : FarmerEntityTypeConfiguration<SystemAccount>
        {
            public SystemAccountMapping()
            {
                this.HasKey(r => r.Id);
                this.Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
                this.HasRequired(r => r.User).WithMany().HasForeignKey(fk => fk.UserId);
            }
        }
    

      

     public class UserMapping : FarmerEntityTypeConfiguration<User>
        {
            public UserMapping()
            {
                
                this.HasKey(r => r.Id);
                this.Property(r => r.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
                this.HasRequired(r => r.Account).WithMany().HasForeignKey(fk => fk.AccountId);
            }
        }
    

      然后加上数据库初始化种子数据

    internal sealed class CreateIfNoExistDatabase : DbMigrationsConfiguration<FarmerObjectContext>
        {
            public CreateIfNoExistDatabase()
            {
                AutomaticMigrationsEnabled = true;
                AutomaticMigrationDataLossAllowed = true;
            }
    
            protected override void Seed(FarmerObjectContext context)
            {
                SystemAccount account = new SystemAccount();
                account.UserName = "shatan776";
                account.Salt = "oxml";
                account.Password = StringUtils.GenerateSaltedHash("123456", StringUtils.CreateSalt(AppConstants.SaltSize));
                account.User = account.CreateUser("老子就是张三");
                context.Set<SystemAccount>().Add(account);
                context.SaveChanges();
            }
        }
    

      

       满脸欢喜的debug,来上一口16年的雪碧,静静的等着,结果任务栏宇宙第一ide VisualStudio加蓝,

       将 FOREIGN KEY 约束 'FK_dbo.Farmer_User_dbo.Farmer_SystemAccount_AccountId' 引入表 'Farmer_User' 可能会导致循环或多重级联路径。请指定 ON DELETE    NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。
       无法创建约束。请参阅前面的错误消息。

       多重循环引用,纳尼,

      难道是SystemAccount中加载了User的导航,User中也有,重复了?于是乎,注释掉UserMapping中的导航配置

    //this.HasRequired(r => r.Account).WithMany().HasForeignKey(fk => fk.AccountId);
    

      继续debug错误依据,于是乎又把导航Id注释掉

        //public Guid AccountId { get; set; }

        哒哒哒达,终于生成了数据库,种子数据也有插入

    一对一的关系就这样生成了,执子之手,与子偕老,张三看上了李四。。。

    琢磨着把以前的账户系统移过来,以前的主键是int类型的数据库自增的,修改相应类型后,报错了,找不到account_target,也对,当插入到数据库中时account主键Id是没有生成的,所以user是插入不进去的,笨办法,先插入account,然后再插入user,暂时解决了问题!

    看了一下生成的数据库外键图

    看数据库生成的关系,0=》1。。。可以送SystemAccount实体类中生成User,而User中生成SystemAccount就会报错,用户信息必须有会员账户记录,而会员账户记录可以没有用户信息

    更多资料参考

    Entity Framework - 理清关系 - 基于外键关联的单向一对一关系

  • 相关阅读:
    Map
    input输入框文字提示IE兼容
    Linux下实现获取远程机器文件
    ssl_error_rx_record_too_long
    Linux下访问网站
    Linux安装Jdk1.7
    bootstrap左右圆角按钮-适配手机页面
    jQuery使用load方法加载其他文档内容
    Js操作DOM小练习_01
    BootstrapValidator验证表单用法
  • 原文地址:https://www.cnblogs.com/shatanku/p/EntityFramework.html
Copyright © 2011-2022 走看看